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