Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Re: Separating big numbers with commas

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


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

Uh, this doesn't work.
  • Comment on Re: Re: Separating big numbers with commas

Replies are listed 'Best First'.
Re: Re: Re: Separating big numbers with commas
by blakem (Monsignor) on Sep 05, 2001 at 01:26 UTC
    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

      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.

      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://110142]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (6)
As of 2020-12-02 07:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How often do you use taint mode?





    Results (35 votes). Check out past polls.

    Notices?