fix sival log for negative/zero values
[barcat.git] / barcat
diff --git a/barcat b/barcat
index b6f60ef2a6b36355c1de63f3d6a96a935fe108ea..48464342d6f2d2053fe28fb1f835ea9b364136c8 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -143,10 +143,11 @@ if ($opt{markers} // 1 and $size > 0) {
 @lines > $nr or return if $opt{hidemin};
 
 sub sival {
-       my $unit = int(log($_[0]) / log(1000) - ($_[0] < 1));
-       my $float = $_[0] !~ /^ (?: 0*\.)? [0-9]{1,3} $/x;
+       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 : 3, $float,  # length and tenths
+               $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]
@@ -192,6 +193,7 @@ if ($opt{stat}) {
 }
 
 __END__
+=encoding utf8
 
 =head1 NAME
 
@@ -349,7 +351,10 @@ Any kind of database query with counts, preserving returned alignment:
 External datasets, like movies per year:
 
     curl https://github.com/prust/wikipedia-movie-data/raw/master/movies.json |
-    jq '.[].year' | uniq -c | barcat
+    perl -054 -nlE 'say if s/^"year"://' | uniq -c | barcat
+
+But please get I<jq> to process JSON
+and replace the manual selection by C<< jq '.[].year' >>.
 
 Pokémon height comparison: