Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: (Golf) Formatting Integer To Money

by Abigail-II (Bishop)
on Aug 29, 2002 at 17:04 UTC ( [id://193824]=note: print w/replies, xml ) Need Help??


in reply to (Golf) Formatting NumberTo Money

57 characters:
sub a{$_=sprintf"%.2f",pop;{s/(\d)(\d{3})(?!\d)/$1,$2/&&redo}$_}
Abigail

Replies are listed 'Best First'.
Re: Re: (Golf) Formatting Integer To Money
by dpuu (Chaplain) on Aug 29, 2002 at 17:41 UTC
    49 Characters:
    sub a{$_=sprintf"%.2f",pop;while(s/\B\d{3}\b/,$&/){}$_}
    Update: 48 characters:
    sub a{$_=sprintf"%.2f",pop;{s/\B\d{3}\b/,$&/&&redo}$_}
    --Dave
      Here's a 44 with a few small improvements to yours:
      sub a{$_=sprintf"%.2f",@_;1while s/\B...\D/,$&/;$_}
      It seems that the sprintf solutions fail sometimes in rounding, e.g. "123456789012345.125" becomes "123,456,789,012,345.12" instead of "123,456,789,012,345.13".

      Update: I was just informed by thospel++ that IEEE rounding is toward even, not upward. That explains the behavior, though I'm not sure if it's the desired behavior for this problem.

      -- Mike

      --
      just,my${.02}

        Actually, this is the expected rounding. If you think about it, only half of them should round up (and the other half down) since that will give a more accurate average. In this case .125 rounds down, if you try .135 it will round up and .145 will round down.
           larryk                                          
        perl -le "s,,reverse killer,e,y,rifle,lycra,,print"
        
Re: Re: (Golf) Formatting Integer To Money
by xylus (Pilgrim) on Aug 29, 2002 at 17:36 UTC
    Why the need for sprintf ?? Am I missing something of importance?

    If sprintf is not needed, here is one at 49 chars....
    sub a{$_=pop;{s/(\d)(\d{3})(?!\d)/$1,$2/&&redo}$_.'.00'}
    update: I am a little confused about the input, the post asks for an integer, which would not have any decimal places, but some of the input has a decimal place..
    Should this handle input with decimal places, or should it just trust that the user submits integers only?
    perl -e '$_=$0;split??;chop$_;$;=pop@_;$;++for(0..9060420);$_.=reverse +$;;print'
      To get the precision correct. Your script fails if you input 1234.56.

      ++Abigail-II

      enoch

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (3)
As of 2025-06-18 04:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.