$text =~ s/(\d+)/munge($1)/eg; ^ | #### my $number = shift; #### sub eng_not { # Format a numeric value using engineering notation. # Examples: # 1234 --> 1.23k # 5e-5 --> 50u my $num = shift; my $mult; my $prefix; my $val; my $sign = ($num<0) ? '-' : ''; $num = abs $num; if ( ($num > 1e15) || ($num < 1e-15) ) { return sprintf '%3.2e', $num } if ($num > 1e12) { $prefix = 'T'; $mult = 1e12; } elsif ($num > 1e9) { $prefix = 'G'; $mult = 1e9; } elsif ($num > 1e6) { $prefix = 'M'; $mult = 1e6; } elsif ($num > 1e3) { $prefix = 'k'; $mult = 1e3; } elsif ($num > 1e0) { $prefix = '' ; $mult = 1e0; } elsif ($num > 1e-3) { $prefix = 'm'; $mult = 1e-3; } elsif ($num > 1e-6) { $prefix = 'u'; $mult = 1e-6; } elsif ($num > 1e-9) { $prefix = 'n'; $mult = 1e-9; } elsif ($num > 1e-12) { $prefix = 'p'; $mult = 1e-12; } $val = sprintf '%f', $num/$mult; $val = substr($val,0,4); # only want 3 digits and decimal point $val =~ s/0$//; # delete 1st trailing 0, if any $val =~ s/0$//; # delete 2nd trailing 0, if any $val =~ s/\.$//; # delete trailing decimal point, if any return $sign . $val . $prefix; }