xref: /freebsd/lib/libutil/humanize_number.3 (revision 7d14df1a2d82bf1bc811ba2e33804a6de0504240)
123d1a178SPawel Jakub Dawidek.\"	$NetBSD: humanize_number.3,v 1.4 2003/04/16 13:34:37 wiz Exp $
223d1a178SPawel Jakub Dawidek.\" $FreeBSD$
323d1a178SPawel Jakub Dawidek.\"
423d1a178SPawel Jakub Dawidek.\" Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
523d1a178SPawel Jakub Dawidek.\" All rights reserved.
623d1a178SPawel Jakub Dawidek.\"
723d1a178SPawel Jakub Dawidek.\" This code is derived from software contributed to The NetBSD Foundation
823d1a178SPawel Jakub Dawidek.\" by Luke Mewburn and by Tomas Svensson.
923d1a178SPawel Jakub Dawidek.\"
1023d1a178SPawel Jakub Dawidek.\" Redistribution and use in source and binary forms, with or without
1123d1a178SPawel Jakub Dawidek.\" modification, are permitted provided that the following conditions
1223d1a178SPawel Jakub Dawidek.\" are met:
1323d1a178SPawel Jakub Dawidek.\" 1. Redistributions of source code must retain the above copyright
1423d1a178SPawel Jakub Dawidek.\"    notice, this list of conditions and the following disclaimer.
1523d1a178SPawel Jakub Dawidek.\" 2. Redistributions in binary form must reproduce the above copyright
1623d1a178SPawel Jakub Dawidek.\"    notice, this list of conditions and the following disclaimer in the
1723d1a178SPawel Jakub Dawidek.\"    documentation and/or other materials provided with the distribution.
1823d1a178SPawel Jakub Dawidek.\"
1923d1a178SPawel Jakub Dawidek.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2023d1a178SPawel Jakub Dawidek.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2123d1a178SPawel Jakub Dawidek.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2223d1a178SPawel Jakub Dawidek.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2323d1a178SPawel Jakub Dawidek.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2423d1a178SPawel Jakub Dawidek.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2523d1a178SPawel Jakub Dawidek.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2623d1a178SPawel Jakub Dawidek.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2723d1a178SPawel Jakub Dawidek.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2823d1a178SPawel Jakub Dawidek.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2923d1a178SPawel Jakub Dawidek.\" POSSIBILITY OF SUCH DAMAGE.
3023d1a178SPawel Jakub Dawidek.\"
31*7d14df1aSXin LI.Dd Apr 12, 2011
3223d1a178SPawel Jakub Dawidek.Dt HUMANIZE_NUMBER 3
3323d1a178SPawel Jakub Dawidek.Os
3423d1a178SPawel Jakub Dawidek.Sh NAME
3523d1a178SPawel Jakub Dawidek.Nm humanize_number
3623d1a178SPawel Jakub Dawidek.Nd format a number into a human readable form
37e27d1913SPawel Jakub Dawidek.Sh LIBRARY
38e27d1913SPawel Jakub Dawidek.Lb libutil
3923d1a178SPawel Jakub Dawidek.Sh SYNOPSIS
40d268591bSTom Rhodes.In libutil.h
4123d1a178SPawel Jakub Dawidek.Ft int
42fd132368SRuslan Ermilov.Fo humanize_number
43fd132368SRuslan Ermilov.Fa "char *buf" "size_t len" "int64_t number" "const char *suffix"
44fd132368SRuslan Ermilov.Fa "int scale" "int flags"
45fd132368SRuslan Ermilov.Fc
4623d1a178SPawel Jakub Dawidek.Sh DESCRIPTION
4723d1a178SPawel Jakub DawidekThe
4823d1a178SPawel Jakub Dawidek.Fn humanize_number
4969560edcSPawel Jakub Dawidekfunction formats the signed 64-bit quantity given in
5023d1a178SPawel Jakub Dawidek.Fa number
5123d1a178SPawel Jakub Dawidekinto
525f2e9efbSGlen Barber.Fa buf .
5323d1a178SPawel Jakub DawidekA space and then
5423d1a178SPawel Jakub Dawidek.Fa suffix
5523d1a178SPawel Jakub Dawidekis appended to the end.
5669560edcSPawel Jakub DawidekThe buffer pointed to by
575f2e9efbSGlen Barber.Fa buf
5823d1a178SPawel Jakub Dawidekmust be at least
5923d1a178SPawel Jakub Dawidek.Fa len
6013c273c8SXin LIbytes long.
6123d1a178SPawel Jakub Dawidek.Pp
6223d1a178SPawel Jakub DawidekIf the formatted number (including
6323d1a178SPawel Jakub Dawidek.Fa suffix )
6423d1a178SPawel Jakub Dawidekwould be too long to fit into
655f2e9efbSGlen Barber.Fa buf ,
6623d1a178SPawel Jakub Dawidekthen divide
6723d1a178SPawel Jakub Dawidek.Fa number
6823d1a178SPawel Jakub Dawidekby 1024 until it will.
6923d1a178SPawel Jakub DawidekIn this case, prefix
7023d1a178SPawel Jakub Dawidek.Fa suffix
71*7d14df1aSXin LIwith the appropriate designator.
72a73a3ab5SRuslan ErmilovThe
73a73a3ab5SRuslan Ermilov.Fn humanize_number
74*7d14df1aSXin LIfunction follows the traditional computer science conventions by
75*7d14df1aSXin LIdefault, rather than the IEE/IEC (and now also SI) power of two
76*7d14df1aSXin LIconvention or the power of ten notion.
77*7d14df1aSXin LIThis behaviour however can be altered by specifying the
78*7d14df1aSXin LI.Dv HN_DIVISOR_1000
79*7d14df1aSXin LIand
80*7d14df1aSXin LI.Dv HN_IEC_PREFIXES
81*7d14df1aSXin LIflags.
8223d1a178SPawel Jakub Dawidek.Pp
83*7d14df1aSXin LIThe traditional
84*7d14df1aSXin LI.Pq default
85*7d14df1aSXin LIprefixes are:
86d5fbc8f4SWarner Losh.Bl -column "Prefix" "Description" "1000000000000000000" -offset indent
87d5fbc8f4SWarner Losh.It Sy "Prefix" Ta Sy "Description" Ta Sy "Multiplier" Ta Sy "Multiplier 1000x"
88*7d14df1aSXin LI.It Li (note) Ta No kilo Ta 1024 Ta 1000
89d5fbc8f4SWarner Losh.It Li M Ta No mega Ta 1048576 Ta 1000000
90d5fbc8f4SWarner Losh.It Li G Ta No giga Ta 1073741824 Ta 1000000000
91d5fbc8f4SWarner Losh.It Li T Ta No tera Ta 1099511627776 Ta 1000000000000
92d5fbc8f4SWarner Losh.It Li P Ta No peta Ta 1125899906842624 Ta 1000000000000000
93d5fbc8f4SWarner Losh.It Li E Ta No exa Ta 1152921504606846976 Ta 1000000000000000000
9423d1a178SPawel Jakub Dawidek.El
9523d1a178SPawel Jakub Dawidek.Pp
96*7d14df1aSXin LINote:
97*7d14df1aSXin LIAn uppercase K indicates a power of two, a lowercase k a power of ten.
98*7d14df1aSXin LI.Pp
99*7d14df1aSXin LIThe IEE/IEC (and now also SI) power of two prefixes are:
100*7d14df1aSXin LI.Bl -column "Prefix" "Description" "1000000000000000000" -offset indent
101*7d14df1aSXin LI.It Sy "Prefix" Ta Sy "Description" Ta Sy "Multiplier"
102*7d14df1aSXin LI.It Li Ki Ta No kibi Ta 1024
103*7d14df1aSXin LI.It Li Mi Ta No mebi Ta 1048576
104*7d14df1aSXin LI.It Li Gi Ta No gibi Ta 1073741824
105*7d14df1aSXin LI.It Li Ti Ta No tebi Ta 1099511627776
106*7d14df1aSXin LI.It Li Pi Ta No pebi Ta 1125899906842624
107*7d14df1aSXin LI.It Li Ei Ta No exbi Ta 1152921504606846976
108*7d14df1aSXin LI.El
109*7d14df1aSXin LI.Pp
11069560edcSPawel Jakub DawidekThe
11123d1a178SPawel Jakub Dawidek.Fa len
11269560edcSPawel Jakub Dawidekargument must be at least 4 plus the length of
11323d1a178SPawel Jakub Dawidek.Fa suffix ,
11423d1a178SPawel Jakub Dawidekin order to ensure a useful result is generated into
1155f2e9efbSGlen Barber.Fa buf .
11623d1a178SPawel Jakub DawidekTo use a specific prefix, specify this as
11723d1a178SPawel Jakub Dawidek.Fa scale
118*7d14df1aSXin LI.Po multiplier = 1024 ^ scale;
119*7d14df1aSXin LIwhen
120*7d14df1aSXin LI.Dv HN_DIVISOR_1000
121*7d14df1aSXin LIis specified,
122*7d14df1aSXin LImultiplier = 1000 ^ scale
123*7d14df1aSXin LI.Pc .
12423d1a178SPawel Jakub DawidekThis cannot be combined with any of the
12523d1a178SPawel Jakub Dawidek.Fa scale
12623d1a178SPawel Jakub Dawidekflags below.
12723d1a178SPawel Jakub Dawidek.Pp
12823d1a178SPawel Jakub DawidekThe following flags may be passed in
12969560edcSPawel Jakub Dawidek.Fa scale :
13069560edcSPawel Jakub Dawidek.Bl -tag -width ".Dv HN_DIVISOR_1000" -offset indent
13123d1a178SPawel Jakub Dawidek.It Dv HN_AUTOSCALE
13223d1a178SPawel Jakub DawidekFormat the buffer using the lowest multiplier possible.
13323d1a178SPawel Jakub Dawidek.It Dv HN_GETSCALE
13423d1a178SPawel Jakub DawidekReturn the prefix index number (the number of times
13523d1a178SPawel Jakub Dawidek.Fa number
13623d1a178SPawel Jakub Dawidekmust be divided to fit) instead of formatting it to the buffer.
13723d1a178SPawel Jakub Dawidek.El
13823d1a178SPawel Jakub Dawidek.Pp
13923d1a178SPawel Jakub DawidekThe following flags may be passed in
14069560edcSPawel Jakub Dawidek.Fa flags :
14169560edcSPawel Jakub Dawidek.Bl -tag -width ".Dv HN_DIVISOR_1000" -offset indent
14223d1a178SPawel Jakub Dawidek.It Dv HN_DECIMAL
14323d1a178SPawel Jakub DawidekIf the final result is less than 10, display it using one digit.
14423d1a178SPawel Jakub Dawidek.It Dv HN_NOSPACE
14523d1a178SPawel Jakub DawidekDo not put a space between
14623d1a178SPawel Jakub Dawidek.Fa number
14723d1a178SPawel Jakub Dawidekand the prefix.
14823d1a178SPawel Jakub Dawidek.It Dv HN_B
14969560edcSPawel Jakub DawidekUse
15069560edcSPawel Jakub Dawidek.Ql B
15169560edcSPawel Jakub Dawidek(bytes) as prefix if the original result does not have a prefix.
15223d1a178SPawel Jakub Dawidek.It Dv HN_DIVISOR_1000
15323d1a178SPawel Jakub DawidekDivide
15423d1a178SPawel Jakub Dawidek.Fa number
15523d1a178SPawel Jakub Dawidekwith 1000 instead of 1024.
156*7d14df1aSXin LI.It Dv HN_IEC_PREFIXES
157*7d14df1aSXin LIUse the IEE/IEC notion of prefixes (Ki, Mi, Gi...).
158*7d14df1aSXin LIThis flag has no effect when
159*7d14df1aSXin LI.Dv HN_DIVISOR_1000
160*7d14df1aSXin LIis also specified.
16123d1a178SPawel Jakub Dawidek.El
16223d1a178SPawel Jakub Dawidek.Sh RETURN VALUES
16369560edcSPawel Jakub DawidekThe
16423d1a178SPawel Jakub Dawidek.Fn humanize_number
16569560edcSPawel Jakub Dawidekfunction returns the number of characters stored in
1665f2e9efbSGlen Barber.Fa buf
16769560edcSPawel Jakub Dawidek(excluding the terminating
16869560edcSPawel Jakub Dawidek.Dv NUL )
16969560edcSPawel Jakub Dawidekupon success, or \-1 upon failure.
17023d1a178SPawel Jakub DawidekIf
17123d1a178SPawel Jakub Dawidek.Dv HN_GETSCALE
17223d1a178SPawel Jakub Dawidekis specified, the prefix index number will be returned instead.
173c2fc8cebSPawel Jakub Dawidek.Sh SEE ALSO
174c2fc8cebSPawel Jakub Dawidek.Xr expand_number 3
175*7d14df1aSXin LI.Sh STANDARDS
176*7d14df1aSXin LIThe
177*7d14df1aSXin LI.Dv HN_DIVISOR_1000
178*7d14df1aSXin LIand
179*7d14df1aSXin LI.Dv HN_IEC_PREFIXES
180*7d14df1aSXin LIflags
181*7d14df1aSXin LIconform to
182*7d14df1aSXin LI.Tn ISO/IEC
183*7d14df1aSXin LIStd\~80000-13:2008
184*7d14df1aSXin LIand
185*7d14df1aSXin LI.Tn IEEE
186*7d14df1aSXin LIStd\~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 .
194*7d14df1aSXin LIThe
195*7d14df1aSXin LI.Dv HN_IEC_PREFIXES
196*7d14df1aSXin LIflag was introduced in
197*7d14df1aSXin LI.Fx 9.0 .
198