Страница 194 из 253
fputs(buf, stdout);
return 0;
}
При запуске в двух различных локалях она выдает такой результат:
$ <b>LC_ALL=en_US ch13-strfmon</b> /* В Соединенных Штатах */
You owe me $1,234.57 (USD 1,234.57)
$ <b>LC_ALL=it_IT ch13-strfmon</b> /* В Италии */
You owe me EUR 1.235 (EUR 1.235)
Как вы можете видеть, strfmon() подобна strftime(), копируя обычные символы в буфер назначения без изменений и форматируя аргументы в соответствии со своими собственными спецификациями форматирования. Их всего три.
%n Вывести национальное (т.е. местное) представление значения валюты.
%i Вывести международное представление значения валюты.
%% Вывести символ '%'.
Форматируемые значения должны иметь тип double. Разницу между %n и %i мы видим в локали "en_US": %n использует символ $, тогда как %i использует USD, которая означает «доллары США».
Гибкость — и соответственно определенная сложность — сопровождают многие функции API, разработанные для POSIX, и strfmon() не является исключением. Как и с printf(), несколько необязательных элементов, которые могут быть между % и i или n, обеспечивают повышенный контроль. Полные формы следующие:
%[<i>флаги</i>][<i>ширина поля</i>][#<i>точность_слева</i>][.<i>точность_справа</i>]i
%[<i>флаги</i>][<i>ширина поля</i>][#<i>точность_слева</i>][.<i>точность_справа</i>]n
%% /* Не допускаются поля флагов, ширины и т.д. */
Флаги перечислены в табл. 13.2.
Таблица 13.2. Флаги для strfmon()