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

Re: Re: Re: Separating big numbers with commas

by blakem (Monsignor)
on Sep 05, 2001 at 01:26 UTC ( #110162=note: print w/replies, xml ) Need Help??


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

Looks fine to me....
#!/usr/bin/perl -wT use strict; my $number='1234567890.01'; # with commas, should be "1,234,567,890.01 +" print "N=$number\n"; $number =~ s/(\d)(?=(\d{3})+(\D|$))/$1\,/g; print "N=$number\n";
Output
N=1234567890.01 N=1,234,567,890.01
Care to elaborate on which part doesn't work?

-Blake

Replies are listed 'Best First'.
Re: Re: Re: Re: Separating big numbers with commas
by Anonymous Monk on Sep 05, 2001 at 02:07 UTC

    Heh, add a couple more decimal places and it will fail (unless you consider commas after the decimal point to be allowable):

    #!/usr/bin/perl -w use strict; my $number='12345.67890'; # with commas, should be: 12,345.67890 print "N=$number\n"; $number =~ s/(\d)(?=(\d{3})+(\D|$))/$1\,/g; print "N=$number\n";

    Output:

    N=12345.67890 N=12,345.67,890

    Looks funky to me.

Re: Re: Re: Re: Separating big numbers with commas
by Sifmole (Chaplain) on Sep 05, 2001 at 16:51 UTC
    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://110162]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2020-05-29 18:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (170 votes). Check out past polls.

    Notices?