From: Christian Hesse Date: Tue, 4 Nov 2014 21:17:15 +0000 (+0100) Subject: ip-link: in human readable output use dynamic precision length X-Git-Tag: v3.18.0~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50ec66507b5e8f58540a87360ace72b0c88a2a36;p=thirdparty%2Fiproute2.git ip-link: in human readable output use dynamic precision length --- diff --git a/ip/ipaddress.c b/ip/ipaddress.c index e240bb548..db3943730 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -324,6 +324,8 @@ static void print_num(FILE *fp, unsigned width, uint64_t count) const char *prefix = "kMGTPE"; const unsigned int base = use_iec ? 1024 : 1000; uint64_t powi = 1; + uint16_t powj = 1; + uint8_t precision = 2; char buf[64]; if (!human_readable || count < base) { @@ -343,8 +345,15 @@ static void print_num(FILE *fp, unsigned width, uint64_t count) ++prefix; } - snprintf(buf, sizeof(buf), "%.1f%c%s", (double) count / powi, - *prefix, use_iec ? "i" : ""); + /* try to guess a good number of digits for precision */ + for (; precision > 0; precision--) { + powj *= 10; + if (count / powi < powj) + break; + } + + snprintf(buf, sizeof(buf), "%.*f%c%s", precision, + (double) count / powi, *prefix, use_iec ? "i" : ""); fprintf(fp, "%-*s ", width, buf); }