use warnings; use strict; use POSIX; for my $num (0, -0.1, 0.1, 999.99, 1000, -999.99, -1000, 1.234e34, 1.234e-34){ printf "%-10s %-10s\n", $num, asEng ($num); } sub asEng { my ($num) = @_; return '0' if +$num eq '0'; my $sign = ($num < 0) ? '-' : ''; $num = abs $num; my $e = floor( log($num) / log(1000) ); my $mult = 1000**$e; $e *= 3; $num = $num / $mult; return "$sign${num}e$e"; } #### 0 0 -0.1 -100e-3 0.1 100e-3 999.99 999.99e0 1000 1e3 -999.99 -999.99e0 -1000 -1e3 1.234e+034 12.34e33 1.234e-034 123.4e-36