in reply to Formatting a number

This is not really answering the OP as it is not a one-liner nor does it use a regex. But, in the spirit of TIMTOWTDI

use strict; use warnings; printf qq{%20s\n}, comma3($_) for (12, 1234, 1234567, 1234567890); sub comma3 { my $ct = 0; join q{}, reverse map {++ $ct % 3 ? $_ : ($_, q{,})} reverse split m{}, $_[0]; }

produces

12 1,234 1,234,567 1,234,567,890

Cheers,

JohnGG

Update: Subroutine was erroneously putting commas at the front of numbers with lengths divisble by three, thanks jwkrahn for pointing this out. Revised subroutine (which is, of course, even slower) below

sub comma3 { my $ct = 0; my $len = length $_[0]; return join q{}, reverse map { ++ $ct % 3 ? $_ : $ct == $len ? $_ : ($_, q{,}) } reverse split m{}, $_[0]; }

Benchmarks will be updated in a bit.

Replies are listed 'Best First'.
Re^2: Formatting a number
by jwkrahn (Abbot) on Oct 16, 2006 at 19:09 UTC
    $ perl -le' my $number = 123456789; my $ct = 0; $number = join q{}, reverse map { ++$ct % 3 ? $_ : ( $_, q{,} ) } reverse split //, $number; print $number; ' ,123,456,789
    Oops, You have an extra comma at the beginning.

      So, not only slow but wrong, damn!