Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: Re: Re: Re: Separating big numbers with commas

by Sifmole (Chaplain)
on Sep 05, 2001 at 16:51 UTC ( #110269=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Re: Separating big numbers with commas
in thread Separating big numbers with commas

Okay.
Firstly, your example which does not work either, is different from the first example. The first example was
$number=1234567; # with commas, should be "1,234,567" $number =~ s/(\d)(?=(\d{3})+(\D|$))/$1\,/g;
Which will result in the string 1,2,3,4,5,6,7; Not quite what we were looking for.

Your second example both extends the string and adds a decimal portion, and does not work either.

$number='1234567890.01'; $number =~ s/(\d)(?=(\d{3})+(\D|$))/$1\,/g;
Resulting in 1,234,567,890.0,1; You will notice the comma in the decimal portion of the resulting string. I find it strange the the output you presented in your message is correct. Did you paste it from a run, or transcribe it and introduce the alteration in the result by accident? As pointed out by Anon, if you introduce a few more decimal places you will end up with more commas in the decimal portion.
$number='1234567890.0123456789'; # with commas, should be "1,234,567,8 +90.01 $number =~ s/(\d)(?=(\d{3})+(\D|$))/$1\,/g;
Resulting in 1,234,567,890.0,1,2,3,4,5,6,7,8,9.

The problem comes in because we are testing against \D|$ to determine when to place to commas. This allows commas to be placed in the decimal portion. I don't have a great solution but you can do something like the following:

$number='1234567890'; # with commas, should be "1,234,567,890.01 $number .= '.' if ($number !~ /\./); # Make sure we end with a decimal + if we don't have a decimal $number =~ s/(\d)(?=(\d{3},?)+(\.))/$1\,/g; chop $number if ($number =~ /\.$/); # Get rid of that useless trailing + decimal print "N $number \n"; $number='1234567890.01234567687'; # with commas, should be "1,234,567, +890.01 $number .= '.' if ($number !~ /\./);# Make sure we end with a decimal +if we don't have a decimal $number =~ s/(\d)(?=(\d{3},?)+(\.))/$1\,/g; chop $number if ($number =~ /\.$/); # Get rid of that useless trailing + decimal print "N $number \n";
The are better solutions presented, I just wanted to respond to why this example did not work.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://110269]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2020-05-30 12:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (171 votes). Check out past polls.

    Notices?