print add_commas( '+1234567.123456789010'), $/; print add_commas_arb_string( 'Hello +1234567.123456 Hello -1234567.123456' ); sub add_commas { my ( $number ) = @_; return undef unless $number; ( $number, my $dec ) = $number =~ m!([+-]?\d+)\.?(\d*)!; return undef unless $number; $number =~ s/(\d)(?=(\d{3})+(\D|$))/$1,/g if length($number) > 3; return $dec ? "$number.$dec" : $number; } sub add_commas_arb_string { my ( $string ) = @_; $string =~ s/([+-]?\d(?:\d*\.\d+|\d*))/add_commas($1)/ge; return $string; } __DATA__ +1,234,567.123456789010 Hello +1,234,567.123456 Hello -1,234,567.123456