STRFMON(3)

ИМЯ
strfmon - преобразует денежное значение в строку

ОБЗОР
#include <monetary.h>

ssize_t strfmon(char *s, size_t max, const char *format, ...);

ОПИСАНИЕ
Функция strfmon() преобразует заданные суммы в соответствии с определённым форматом format и помещает результат в символьный массив s размера max.

Обычные символы, заданные в аргументе format, копируются в s без преобразования. Определители преобразования начинаются с символа '%'. Непосредственно за ними может следовать ноль или более флагов:

=f  Однобайтовый символ f используется в качестве числового символа-заполнителя (для выравнивания слева, смотрите ниже). Если символ не указан, то используется символ пробела.

^   Не использовать группирующие символы, которые могут быть определены в текущей локали. По умолчанию, разделение на группы разрядов разрешено.

( или +
    Флаг ( указывает на то, что отрицательные суммы должны быть заключены в скобки. Флаг + указывает на то, что наличие знака у суммы должно обрабатываться стандартным способом, то есть зависит от локали, например может быть так, что в результате ничего не указывается для положительных сумм и «-» для отрицательных.

!   Пропустить текущий символ.

-   Выровнять все поля по левому краю. По умолчанию выравнивание по правому краю.

Далее может быть указана ширина поля: строка с десятичным числом, определяющая минимальную ширину поля в байтах. По умолчанию 0. Если результат меньше чем эта ширина, то он дополняется пробелами (слева, если установлен флаг выравнивания по левому краю).

Далее может быть указана ширина целой части числа: символ «#», за которым следует строка с десятичным числом. Если количество цифр слева от символа разделителя меньше, чем ширина целой части, то предоставление дополняется слева числовым символом-заполнителем. Группирующие символы не учитываются при подсчете этой ширины поля.

Далее может быть указана точность десятичной части: символ «.», за которым следует строка с десятичным числом. Перед форматированием сумма будет округлена до указанного числа знаков. По умолчанию, точность задаётся в элементах frac_digits и int_frac_digits текущей локали. Если десятичная точность равна 0, то разделитель целой и дробной части не печатается (символ-разделитель определяется переменной LC_MONETARY и может отличаться от символа определенного в переменной LC_NUMERIC).

И, наконец, определение преобразования может заканчиваться символом преобразования. Существует три символа преобразования:

%   (Если в строку необходимо включить этот символ, то он задаётся как «%%».) Помещает символ '%' в строку-результат.

i   Аргумент типа double преобразуется с использованием локального интернационального формата валюты.

n   Аргумент типа double преобразуется с использованием локального национального формата валюты.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция strfmon() возвращает количество символов, помещённых в массив s, без учёта конечного байта null, предоставляя строку, включающую конечный байт null. Иначе она устанавливает errno в значение E2BIG, возвращает -1, а содержимое массива не определено.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
strfmon() | безвредность в нитях | безвредно (MT-Safe locale)

СООТВЕТСТВИЕ СТАНДАРТАМ
Нет в POSIX.1-2001. Присутствует в некоторых других системах.

ПРИМЕР
Вызов
strfmon(buf, sizeof(buf), "[%^=*#6n] [%=*#6i]",
        1234.567, 1234.567);
результат
[ fl **1234,57] [ NLG **1 234,57]
в голландской локали (с fl для флоринов и NLG для нидерландских гульденов). Группирующий символ выглядит очень некрасиво, так как занимает столько же места что и цифра, хотя должен занимать не более половины, и несомненно вызовет беспорядок. Неожиданно, что fl стоит впереди и за ним следует пробел, а NLG стоит впереди и за ним следует два пробела. Это может быть из-за ошибки в файлах локали. Примеры для итальянской, австралийской, швейцарской и португальской локалей
[ L. **1235] [ ITL **1.235]
[ $**1234.57] [ AUD **1,234.57]
[Fr. **1234,57] [CHF **1.234,57]
[ **1234$57Esc] [ **1.234$57PTE ]

СМОТРИТЕ ТАКЖЕ
setlocale(3), sprintf(3), locale(7)