in reply to Re: Formatting a number
in thread Formatting a number

You can shave a few points off of your substr sub by taking the abs and length functions out of the loop:
sub useSubstr { my $number = shift; my $length = -( 1 + length $number ); my $offset = -3; while ( $offset > $length ) { substr $number, $offset, 0, q{,}; $offset -= 4; } return $number; }

Replies are listed 'Best First'.
Re^3: Formatting a number
by johngg (Canon) on Oct 17, 2006 at 09:14 UTC
    Problem with that is the length is increasing as you insert commas from the right so it needs to be tested dynamically. Unfortunately, your modification breaks the routine.

    use strict; use warnings; my @nos = qw{ 1 12 123 1234 12345 123456 1234567 12345678 123456789 1234567890 12345678901 123456789012 1234567890123 12345678901234}; printf qq{%20s\n}, useSubstr($_) for @nos; sub useSubstr { my $number = shift; my $length = -( 1 + length $number ); my $offset = -3; while ( $offset > $length ) { substr $number, $offset, 0, q{,}; $offset -= 4; } return $number; }

    produces

    1 12 ,123 1,234 12,345 123,456 1,234,567 12,345,678 123,456,789 1234,567,890 12,345,678,901 123,456,789,012 1234,567,890,123 12345,678,901,234

    As you can see, it breaks out of the while too soon as it has not kept up with the increasing length of the number as the commas go in. I agree that it would be nice to factor abs and length out of the loop but can't quite see how to achieve it.

    Cheers,

    JohnGG

      Right, I didn't test very much.   :-) This works correctly and appears to be about 10% faster:
      sub useSubstr { my $number = shift; my $len = length $number; my $offset = 3; while ( $offset < $len ) { substr $number, -$offset , 0, q{,}; $offset += 4; $len = length $number; } return $number; }
        Nice ++. I don't know why I couldn't suss that one out myself. Perhaps I'd worn my brain out :(