shorten human-readable values to 2-3 digits
authorMischa POSLAWSKY <perl@shiar.org>
Sun, 8 Sep 2019 15:34:44 +0000 (17:34 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Mon, 9 Sep 2019 22:37:53 +0000 (00:37 +0200)
Similar to ls e.a.  Previously reserved 5 characters in order to align
decimal points, but this is pointless with mixed magnitudes.

barcat

diff --git a/barcat b/barcat
index 48464342d6f2d2053fe28fb1f835ea9b364136c8..22f8d31193486139c6b5d8e5531594dff2115488 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -143,14 +143,12 @@ if ($opt{markers} // 1 and $size > 0) {
 @lines > $nr or return if $opt{hidemin};
 
 sub sival {
-       my $unit = int(log(abs $_[0] || 1) / log(1000) - ($_[0] < 1) + 1e-15);
-       my $float = sprintf '%e', $_[0] / 1000 ** $unit;  #TODO: or $_[0] =~ /\./
-       $float -= int($float);
-       sprintf('%*.*f%*s',
-               $float ? (5,1) : (3,0),  # length and tenths
-               $_[0] / 1000 ** $unit,   # number
-               $float ? 0 : 3,          # unit size
-               $#{$opt{units}} >> 1 < abs $unit ? "e$unit" : $opt{units}->[$unit]
+       my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15);
+       my $float = $_[0] !~ /^0*[-0-9]{1,3}$/;
+       sprintf('%3.*f%1s',
+               $float && ($unit % 3) == ($unit < 0),  # tenths
+               $_[0] / 1000 ** int($unit/3),   # number
+               $#{$opt{units}} * 1.5 < abs $unit ? "e$unit" : $opt{units}->[$unit/3]
        );
 }