Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

(Golf) Formatting NumberTo Money

by enoch (Chaplain)
on Aug 29, 2002 at 16:33 UTC ( [id://193816]=perlmeditation: print w/replies, xml ) Need Help??

It has been a while since there has been a good round of golf, so I decided to post one. I couldn't come up with a nice interesting math brain-teaser, so I'll post this one.

The Rules
  • Write a sub that takes a number as an argument and returns it in the standard monetary format -- with comma's and to two decimal places

Expected Input-Output
  • Input: 3
  • Output: 3.00

  • Input: 1000
  • Output: 1,000.00

  • Input: 12345678
  • Output: 12,345,678.00

  • Input: 4444444.11
  • Output: 4,444,444.11

  • Input: 98765.343
  • Output: 98,765.34

  • Input: 111.229
  • Output: 111.23

My Swing (83 chars)
sub a { $_=pop;($_=reverse sprintf"%.2f",$_)=~s/(\d\d\d(?=\d))/$1,/g,return re +verse split'' }

Enoch

(update: Changed "integer" to "number". Integers don't have decimals. Thanks to xylus for pointing out my err.

Replies are listed 'Best First'.
Re: (Golf) Formatting Integer To Money
by Abigail-II (Bishop) on Aug 29, 2002 at 17:04 UTC
    57 characters:
    sub a{$_=sprintf"%.2f",pop;{s/(\d)(\d{3})(?!\d)/$1,$2/&&redo}$_}
    Abigail
      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}

      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
Re: (Golf) Formatting NumberTo Money
by Anonymous Monk on Aug 29, 2002 at 18:36 UTC
    # 48 sub f { use Number::Format':subs';format_number(pop,2,2) } #23456789012345678901234567890123456789012345678
Re: (Golf) Formatting Integer To Money
by Aristotle (Chancellor) on Aug 29, 2002 at 17:53 UTC
    53
    # 1 2 3 4 5 #2345678901234567890123456789012345678901234567890123 $_=sprintf"%.2f",pop;{s/(^\d+)(\d{3})/$1,$2/&&redo}$_

    Makeshifts last the longest.

Re: (Golf) Formatting NumberTo Money
by Django (Pilgrim) on Aug 29, 2002 at 19:06 UTC
    54 without declaration, else 61
    sub a{$_=sprintf"%.2f",pop;{s/(\d+)(\d{3}.*)/$1,$2/?redo:$_}}

    ~Django

    "Why don't we ever challenge the spherical earth theory?"

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-24 21:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found