The stupid question is the question not asked PerlMonks

### (Golf) Formatting NumberTo Money

by enoch (Chaplain)
 on Aug 29, 2002 at 16:33 UTC 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'' } [download]```

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?"

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 contemplating the Monastery: (6)
As of 2024-08-14 08:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When will the AI bubble burst?

Results (29 votes). Check out past polls.

Notices?
 • erzuuli ‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.