xref: /freebsd/lib/libutil/humanize_number.3 (revision b2c76c41be32f904179efed29c0ca04d53f3996c)
123d1a178SPawel Jakub Dawidek.\"	$NetBSD: humanize_number.3,v 1.4 2003/04/16 13:34:37 wiz Exp $
223d1a178SPawel Jakub Dawidek.\"
323d1a178SPawel Jakub Dawidek.\" Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
423d1a178SPawel Jakub Dawidek.\" All rights reserved.
523d1a178SPawel Jakub Dawidek.\"
623d1a178SPawel Jakub Dawidek.\" This code is derived from software contributed to The NetBSD Foundation
723d1a178SPawel Jakub Dawidek.\" by Luke Mewburn and by Tomas Svensson.
823d1a178SPawel Jakub Dawidek.\"
923d1a178SPawel Jakub Dawidek.\" Redistribution and use in source and binary forms, with or without
1023d1a178SPawel Jakub Dawidek.\" modification, are permitted provided that the following conditions
1123d1a178SPawel Jakub Dawidek.\" are met:
1223d1a178SPawel Jakub Dawidek.\" 1. Redistributions of source code must retain the above copyright
1323d1a178SPawel Jakub Dawidek.\"    notice, this list of conditions and the following disclaimer.
1423d1a178SPawel Jakub Dawidek.\" 2. Redistributions in binary form must reproduce the above copyright
1523d1a178SPawel Jakub Dawidek.\"    notice, this list of conditions and the following disclaimer in the
1623d1a178SPawel Jakub Dawidek.\"    documentation and/or other materials provided with the distribution.
1723d1a178SPawel Jakub Dawidek.\"
1823d1a178SPawel Jakub Dawidek.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1923d1a178SPawel Jakub Dawidek.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2023d1a178SPawel Jakub Dawidek.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2123d1a178SPawel Jakub Dawidek.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2223d1a178SPawel Jakub Dawidek.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2323d1a178SPawel Jakub Dawidek.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2423d1a178SPawel Jakub Dawidek.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2523d1a178SPawel Jakub Dawidek.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2623d1a178SPawel Jakub Dawidek.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2723d1a178SPawel Jakub Dawidek.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2823d1a178SPawel Jakub Dawidek.\" POSSIBILITY OF SUCH DAMAGE.
2923d1a178SPawel Jakub Dawidek.\"
3044f01c41SJohn-Mark Gurney.Dd October 7, 2013
3123d1a178SPawel Jakub Dawidek.Dt HUMANIZE_NUMBER 3
3223d1a178SPawel Jakub Dawidek.Os
3323d1a178SPawel Jakub Dawidek.Sh NAME
3423d1a178SPawel Jakub Dawidek.Nm humanize_number
3523d1a178SPawel Jakub Dawidek.Nd format a number into a human readable form
36e27d1913SPawel Jakub Dawidek.Sh LIBRARY
37e27d1913SPawel Jakub Dawidek.Lb libutil
3823d1a178SPawel Jakub Dawidek.Sh SYNOPSIS
39d268591bSTom Rhodes.In libutil.h
4023d1a178SPawel Jakub Dawidek.Ft int
41fd132368SRuslan Ermilov.Fo humanize_number
42fd132368SRuslan Ermilov.Fa "char *buf" "size_t len" "int64_t number" "const char *suffix"
43fd132368SRuslan Ermilov.Fa "int scale" "int flags"
44fd132368SRuslan Ermilov.Fc
4523d1a178SPawel Jakub Dawidek.Sh DESCRIPTION
4623d1a178SPawel Jakub DawidekThe
4723d1a178SPawel Jakub Dawidek.Fn humanize_number
4869560edcSPawel Jakub Dawidekfunction formats the signed 64-bit quantity given in
4923d1a178SPawel Jakub Dawidek.Fa number
5023d1a178SPawel Jakub Dawidekinto
515f2e9efbSGlen Barber.Fa buf .
5223d1a178SPawel Jakub DawidekA space and then
5323d1a178SPawel Jakub Dawidek.Fa suffix
5423d1a178SPawel Jakub Dawidekis appended to the end.
5569560edcSPawel Jakub DawidekThe buffer pointed to by
565f2e9efbSGlen Barber.Fa buf
5723d1a178SPawel Jakub Dawidekmust be at least
5823d1a178SPawel Jakub Dawidek.Fa len
5913c273c8SXin LIbytes long.
6023d1a178SPawel Jakub Dawidek.Pp
6123d1a178SPawel Jakub DawidekIf the formatted number (including
6223d1a178SPawel Jakub Dawidek.Fa suffix )
6323d1a178SPawel Jakub Dawidekwould be too long to fit into
645f2e9efbSGlen Barber.Fa buf ,
6523d1a178SPawel Jakub Dawidekthen divide
6623d1a178SPawel Jakub Dawidek.Fa number
6723d1a178SPawel Jakub Dawidekby 1024 until it will.
6823d1a178SPawel Jakub DawidekIn this case, prefix
6923d1a178SPawel Jakub Dawidek.Fa suffix
707d14df1aSXin LIwith the appropriate designator.
71a73a3ab5SRuslan ErmilovThe
72a73a3ab5SRuslan Ermilov.Fn humanize_number
737d14df1aSXin LIfunction follows the traditional computer science conventions by
747d14df1aSXin LIdefault, rather than the IEE/IEC (and now also SI) power of two
757d14df1aSXin LIconvention or the power of ten notion.
767d14df1aSXin LIThis behaviour however can be altered by specifying the
777d14df1aSXin LI.Dv HN_DIVISOR_1000
787d14df1aSXin LIand
797d14df1aSXin LI.Dv HN_IEC_PREFIXES
807d14df1aSXin LIflags.
8123d1a178SPawel Jakub Dawidek.Pp
827d14df1aSXin LIThe traditional
837d14df1aSXin LI.Pq default
847d14df1aSXin LIprefixes are:
85d5fbc8f4SWarner Losh.Bl -column "Prefix" "Description" "1000000000000000000" -offset indent
86d5fbc8f4SWarner Losh.It Sy "Prefix" Ta Sy "Description" Ta Sy "Multiplier" Ta Sy "Multiplier 1000x"
877d14df1aSXin LI.It Li (note) Ta No kilo Ta 1024 Ta 1000
88d5fbc8f4SWarner Losh.It Li M Ta No mega Ta 1048576 Ta 1000000
89d5fbc8f4SWarner Losh.It Li G Ta No giga Ta 1073741824 Ta 1000000000
90d5fbc8f4SWarner Losh.It Li T Ta No tera Ta 1099511627776 Ta 1000000000000
91d5fbc8f4SWarner Losh.It Li P Ta No peta Ta 1125899906842624 Ta 1000000000000000
92d5fbc8f4SWarner Losh.It Li E Ta No exa Ta 1152921504606846976 Ta 1000000000000000000
9323d1a178SPawel Jakub Dawidek.El
9423d1a178SPawel Jakub Dawidek.Pp
957d14df1aSXin LINote:
967d14df1aSXin LIAn uppercase K indicates a power of two, a lowercase k a power of ten.
977d14df1aSXin LI.Pp
987d14df1aSXin LIThe IEE/IEC (and now also SI) power of two prefixes are:
997d14df1aSXin LI.Bl -column "Prefix" "Description" "1000000000000000000" -offset indent
1007d14df1aSXin LI.It Sy "Prefix" Ta Sy "Description" Ta Sy "Multiplier"
1017d14df1aSXin LI.It Li Ki Ta No kibi Ta 1024
1027d14df1aSXin LI.It Li Mi Ta No mebi Ta 1048576
1037d14df1aSXin LI.It Li Gi Ta No gibi Ta 1073741824
1047d14df1aSXin LI.It Li Ti Ta No tebi Ta 1099511627776
1057d14df1aSXin LI.It Li Pi Ta No pebi Ta 1125899906842624
1067d14df1aSXin LI.It Li Ei Ta No exbi Ta 1152921504606846976
1077d14df1aSXin LI.El
1087d14df1aSXin LI.Pp
10969560edcSPawel Jakub DawidekThe
11023d1a178SPawel Jakub Dawidek.Fa len
11169560edcSPawel Jakub Dawidekargument must be at least 4 plus the length of
11223d1a178SPawel Jakub Dawidek.Fa suffix ,
11323d1a178SPawel Jakub Dawidekin order to ensure a useful result is generated into
1145f2e9efbSGlen Barber.Fa buf .
11523d1a178SPawel Jakub DawidekTo use a specific prefix, specify this as
11623d1a178SPawel Jakub Dawidek.Fa scale
1177d14df1aSXin LI.Po multiplier = 1024 ^ scale;
1187d14df1aSXin LIwhen
1197d14df1aSXin LI.Dv HN_DIVISOR_1000
1207d14df1aSXin LIis specified,
1217d14df1aSXin LImultiplier = 1000 ^ scale
1227d14df1aSXin LI.Pc .
12323d1a178SPawel Jakub DawidekThis cannot be combined with any of the
12423d1a178SPawel Jakub Dawidek.Fa scale
12523d1a178SPawel Jakub Dawidekflags below.
12623d1a178SPawel Jakub Dawidek.Pp
12723d1a178SPawel Jakub DawidekThe following flags may be passed in
12869560edcSPawel Jakub Dawidek.Fa scale :
12969560edcSPawel Jakub Dawidek.Bl -tag -width ".Dv HN_DIVISOR_1000" -offset indent
13023d1a178SPawel Jakub Dawidek.It Dv HN_AUTOSCALE
13123d1a178SPawel Jakub DawidekFormat the buffer using the lowest multiplier possible.
13223d1a178SPawel Jakub Dawidek.It Dv HN_GETSCALE
13323d1a178SPawel Jakub DawidekReturn the prefix index number (the number of times
13423d1a178SPawel Jakub Dawidek.Fa number
13523d1a178SPawel Jakub Dawidekmust be divided to fit) instead of formatting it to the buffer.
13623d1a178SPawel Jakub Dawidek.El
13723d1a178SPawel Jakub Dawidek.Pp
13823d1a178SPawel Jakub DawidekThe following flags may be passed in
13969560edcSPawel Jakub Dawidek.Fa flags :
14069560edcSPawel Jakub Dawidek.Bl -tag -width ".Dv HN_DIVISOR_1000" -offset indent
14123d1a178SPawel Jakub Dawidek.It Dv HN_DECIMAL
14244f01c41SJohn-Mark GurneyIf the final result is less than 10, display it using one decimal place.
14323d1a178SPawel Jakub Dawidek.It Dv HN_NOSPACE
14423d1a178SPawel Jakub DawidekDo not put a space between
14523d1a178SPawel Jakub Dawidek.Fa number
14623d1a178SPawel Jakub Dawidekand the prefix.
14723d1a178SPawel Jakub Dawidek.It Dv HN_B
14869560edcSPawel Jakub DawidekUse
14969560edcSPawel Jakub Dawidek.Ql B
15069560edcSPawel Jakub Dawidek(bytes) as prefix if the original result does not have a prefix.
15123d1a178SPawel Jakub Dawidek.It Dv HN_DIVISOR_1000
15223d1a178SPawel Jakub DawidekDivide
15323d1a178SPawel Jakub Dawidek.Fa number
15423d1a178SPawel Jakub Dawidekwith 1000 instead of 1024.
1557d14df1aSXin LI.It Dv HN_IEC_PREFIXES
1567d14df1aSXin LIUse the IEE/IEC notion of prefixes (Ki, Mi, Gi...).
1577d14df1aSXin LIThis flag has no effect when
1587d14df1aSXin LI.Dv HN_DIVISOR_1000
1597d14df1aSXin LIis also specified.
16023d1a178SPawel Jakub Dawidek.El
16123d1a178SPawel Jakub Dawidek.Sh RETURN VALUES
16244f01c41SJohn-Mark GurneyUpon success, the
16344f01c41SJohn-Mark Gurney.Nm
16444f01c41SJohn-Mark Gurneyfunction returns the number of characters that would have been stored in
1655f2e9efbSGlen Barber.Fa buf
16669560edcSPawel Jakub Dawidek(excluding the terminating
16769560edcSPawel Jakub Dawidek.Dv NUL )
16844f01c41SJohn-Mark Gurneyif
16944f01c41SJohn-Mark Gurney.Fa buf
17044f01c41SJohn-Mark Gurneywas large enough, or \-1 upon failure.
17144f01c41SJohn-Mark GurneyEven upon failure, the contents of
17244f01c41SJohn-Mark Gurney.Fa buf
17344f01c41SJohn-Mark Gurneymay be modified.
17423d1a178SPawel Jakub DawidekIf
17523d1a178SPawel Jakub Dawidek.Dv HN_GETSCALE
17623d1a178SPawel Jakub Dawidekis specified, the prefix index number will be returned instead.
177c2fc8cebSPawel Jakub Dawidek.Sh SEE ALSO
178c2fc8cebSPawel Jakub Dawidek.Xr expand_number 3
1797d14df1aSXin LI.Sh STANDARDS
1807d14df1aSXin LIThe
1817d14df1aSXin LI.Dv HN_DIVISOR_1000
1827d14df1aSXin LIand
1837d14df1aSXin LI.Dv HN_IEC_PREFIXES
1847d14df1aSXin LIflags
185*816ca3d1SGordon Berglingconform to ISO/IEC Std\~80000-13:2008
186*816ca3d1SGordon Berglingand IEEE Std\~1541-2002.
18723d1a178SPawel Jakub Dawidek.Sh HISTORY
18869560edcSPawel Jakub DawidekThe
18923d1a178SPawel Jakub Dawidek.Fn humanize_number
19069560edcSPawel Jakub Dawidekfunction first appeared in
19161881b52SDavid E. O'Brien.Nx 2.0
19261881b52SDavid E. O'Brienand then in
19361881b52SDavid E. O'Brien.Fx 5.3 .
1947d14df1aSXin LIThe
1957d14df1aSXin LI.Dv HN_IEC_PREFIXES
1967d14df1aSXin LIflag was introduced in
1977d14df1aSXin LI.Fx 9.0 .
198e285e32eSBartek Rutkowski.Sh CAVEATS
199e285e32eSBartek RutkowskiFor numbers greater than 999 using buffer length of 4 and less can cause
200e285e32eSBartek Rutkowskirounding errors.
201e285e32eSBartek RutkowskiWhen using
202e285e32eSBartek Rutkowski.Dv HN_IEC_PREFIXES
203e285e32eSBartek Rutkowskithe same error occurs for buffer length of 5 or less.
204