$opt{'sum-format'} = sub { sprintf '%.8g', $_[0] };
$opt{'calc-format'} = sub { sprintf '%*.*f', 0, 2, $_[0] };
$opt{'value-format'} = $opt{units} && sub {
- my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15);
+ my $unit = int(
+ log(abs $_[0] || 1) / log(10)
+ - 3 * ($_[0] < .9995) # shift to smaller unit if below 1
+ - log(.9995) / log(10) # 3 digits rounding up
+ + 1e-15 # float imprecision
+ );
my $float = $_[0] !~ /^0*[-0-9]{1,3}$/;
sprintf('%3.*f%1s',
$float && ($unit % 3) == ($unit < 0), # tenths
color($color) for $val;
}
my $line = $lines[$nr] =~ s/\n/$val/r;
+ if (not length $val) {
+ say $line;
+ next;
+ }
printf '%-*s', $len + length($val), $line;
print $barmark[$_] // $opt{'graph-format'}
for 1 .. $size && (($values[$nr] || 0) - $minval) * $size + .5;