handle numbers with a human-readable scale
() function scans the given number
and looks for a terminal scale multiplier of B, K, M, G, T, P or E (in either
upper or lower case) for Byte, Kilobyte, Megabyte, Gigabyte, Terabyte,
Petabyte, Exabyte (computed using powers of two, i.e., Megabyte = 1024*1024).
The number can have a decimal point, as in 1.5K, which returns 1536
(1024+512). If no scale factor is found, B is assumed.
() function formats a number for
display using the same "human-readable" format, that is, a number
with one of the above scale factors. Numbers will be printed with a maximum of
four digits (preceded by a minus sign if the value is negative); values such
as 0B, 100B, 1023B, 1K, 1.5K, 5.5M, and so on, will be generated. The
“result” buffer must be allocated with at least
bytes. The result will
be left-justified in the given space, and NUL-terminated.
() functions return 0 on success. In
case of error, they return -1, leave *result
as is, and set errno
to one of the following
if the input string
represents a number that is too large to represent.
if an unknown character was used as
scale factor, or if the input to scan_scaled
was malformed, e.g., too many '.' characters.
char *cinput = "1.5K";
long long result;
if (scan_scaled(cinput, &result) == 0)
printf("%s -> %lld\n", cinput, result);
fprintf(stderr, "%s - invalid\n", cinput);
long long ninput = 10483892;
if (fmt_scaled(ninput, buf) == 0)
printf("%lld -> %s\n", ninput, buf);
fprintf(stderr, "fmt scaled failed (errno %d)", errno);
The functions fmt_scaled
() first appeared in
wrote the first version of the
code that became fmt_scaled
(), originally inside
excerpted this and made it into
a library routine (with significant help from Paul
), and wrote scan_scaled
Some of the scale factors have misleading meanings in lower case (p for P is
incorrect; p should be pico- and P for Peta-). However, we bend the SI rules
in favor of common sense here. A person creating a disk partition of
"100m" is unlikely to require 100 millibytes (i.e., 0.1 byte) of
storage in the partition; 100 megabytes is the only reasonable interpretation.
Cannot represent the larger scale factors on all architectures.
Ignores the current locale.