keep valueless lines as is
[barcat.git] / barcat
diff --git a/barcat b/barcat
index ce3f788ec111f137efb183f86ae3a9886cd3b79a..54761d9aaa1835512f2ba4fb8111caf86ed7b2c9 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -112,7 +112,12 @@ $opt{input} = (@ARGV && $ARGV[0] =~ m/\A[-0-9]/) ? \@ARGV : undef
 $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
@@ -286,6 +291,10 @@ while ($nr <= $limit) {
                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;