NAME
strfmon — convert monetary value to string
SYNOPSIS
#include <monetary.h>
ssize_t strfmon(char *__restrict s, size_t maxsize,
const char *__restrict format, ...);
Remarks
The ANSI C ", ...
" construct denotes a variable length argument list whose
optional [or required]
members are given in the associated comment
(/* */).
DESCRIPTION
The
strfmon()
function places characters into the array pointed to by
s
as controlled by the string pointed to by
format.
No more than
maxsize
bytes are placed into the array.
The format is a character string that contains two types of objects:
plain characters, which are simply copied to the output, and
conversion specifications, each of which results in the fetching of
zero or more arguments that are converted and formatted.
The arguments are of type
double,
see the
Conversion Characters
section for details.
The results
are undefined if there are insufficient arguments for the format.
If
the format is exhausted while arguments remain, the excess
arguments are ignored.
A conversion specification is the string
%[flag]...[field_width][#left_precision
][.
right_precision] conversion_character
Each element of the sequence is specified as follows:
Flags
One or more of the following optional flags can be specified to control the
conversion:
- =f
An
=
(equal sign)
followed by a single character
f
which is used as the numeric fill character.
The fill character must be
representable in a single byte in order to work with precision and width
counts.
The default numeric fill character is the space character.
This
flag does not affect field width filling which always uses the space character.
This flag is ignored unless a left precision (see below) is specified.
- ^
Do not format the currency amount with grouping characters.
The default is to
insert the grouping characters if defined for the current locale.
- + or (
Specify the style for representing positive and negative currency amounts.
Only one of
+
or
(
(plus sign or left parenthesis)
may be specified.
If
+
is specified, the locale's
equivalent of + and - are used (for example, in the
en_US.roman8
locale: an empty
string if positive and - if negative).
If
(
is specified, negative
amounts are enclosed within parentheses.
If neither flag is specified,
the
+
style is used.
- !
Suppress the currency symbol from the output conversion.
- -
A minus sign specifying the alignment.
If this flag is present all fields are left-justified
(padded to the right) rather than right-justified.
Field Width
- w
A decimal digit string
w
specifying a minimum field width in bytes in which the result of the
conversion is right-justified (or left-justified if the flag - is
specified).
The default is zero.
Left Precision
- #n
A
#
followed by a decimal digit string
n
specifying a maximum number of digits expected to be formatted to the left
of the radix character.
This option can be used to keep the formatted
output from multiple calls to the
strfmon()
aligned in the same columns.
It can also be used to fill unused positions
with a special character as in $***123.45.
This option causes an amount to
be formatted as if it has the number of digits specified by
n.
If more than
n
digit positions are required, this conversion specification is ignored.
Digit positions in excess of those actually required are
filled with numeric fill character (see the
=f
flag above).
If grouping has not been suppressed with the
^
flag, and it is defined for
the current locale, grouping separators are inserted before the fill
characters (if any) are added.
Grouping separators are not applied to fill
characters even if the fill character is a digit.
To ensure alignment, any characters appearing before or after the number in
the formatted output such as currency or sign symbols are padded as necessary
with space characters to make their positive and negative formats an equal
length.
Right Precision
- .p
A period followed by a decimal digit string
p
specifying the number of digits after the radix character
If the value of the
right precision
p
is zero, no radix character appears
If a right precision is not included, a
default specified by the current locale is used
The amount being formatted is
rounded to the specified number of digits prior to formatting.
Conversion Characters
The conversion characters and their meanings are:
- i
The
double
argument is formatted according to the locale's international currency
format (for example, in the
en_US.roman8
locale:
USD 1,234.56).
- n
The
double
argument is formatted according to the locale's national currency format
(for example, in the
en_US.roman8
locale:
$1,234.56).
- %
Convert to a
%;
no argument is converted.
The entire conversion specification
must be %%.
Notes
The behavior of the
strfmon()
function in a UNIX 2003 conforming application differs from its behavior
in a non-conforming application.
With the conversion character
i,
the
strfmon()
function uses the fourth character of the string defined in
int_curr_symbol
of the current locale instead of a space as a separator for separating
different items in a monetary quantity as dictated by the values of
int_p_sep_by_space
and
int_n_sep_by_space.
Only the first three characters will be taken as the currency symbol.
As a result, the formatting of internationally formatted monetary quantities
may change.
EXTERNAL INFLUENCES
Locale
The
LC_MONETARY
category of the program's locale affects the behavior of this
function including the monetary radix character (which may be different from
the numeric radix character affected by the
LC_NUMERIC
category), the
grouping separator, the currency symbols and formats.
RETURN VALUE
If the total number of resulting bytes including the terminating null byte
is not more than
maxsize,
the
strfmon()
function returns the number of bytes placed into the array pointed to by
s,
not including the terminating null byte
Otherwise, -1 is returned, the
contents of the array are indeterminate, and
errno
is set to indicate the error.
ERRORS
The
strfmon()
function will fail if:
- E2BIG
Conversion stopped due to lack of space in the buffer.
EXAMPLES
The following program segment formats the monetary value
-4321.123
using the
en_US.roman8
locale with a left precision of
5
and
*
as the fill character.
char string[31];
double amt = -4321.123;
setlocale(LC_MONETARY, "en_US.roman8");
strfmon(string, 31, "The amount is %=*#5n.", amt);
The
string
array will contain:
The amount is -$*4,321.12.
As an other example, given the locale of
en_US.roman8
and the values
123.45,
-123.45
and
3456.781:
AUTHOR
strfmon()
was developed by HP.
STANDARDS CONFORMANCE
strfmon(): XPG4, UNIX 2003