Роббинс Арнольд
Шрифт:
printf("mon_thousands_sep = [%s]\n", l.mon_thousands_sep);
printf("positive_sign = [%s]\n", l.positive_sign);
printf("negative_sign = [%s]\n", l.negative_sign);
}
Неудивительно, при запуске в различных локалях мы получаем различные результаты.
$ LC_ALL=en_US ch13-lconv /* Результаты для Соединенных Штатов */
decimal_point = [.]
thousands_sep = [,]
grouping[0] = [3]
grouping[1] = [3]
int_curr_symbol = [USD ]
currency_symbol = [$]
mon_decimal_point = [.]
mon_thousands_sep = [,]
positive_sign = []
negative_sign = [-]
$ LC_ALL=it_IT ch13-lconv /* Результаты для Италии */
decimal_point = [.]
thousands_sep = []
int_curr_symbol = []
currency_symbol = []
mon_decimal_point = []
mon_thousands_sep = []
positive_sign = []
negative_sign = []
Обратите внимание, что значение
int_curr_symbol
в локали "en_US
" включает завершающий символ пробела, который служит для отделения символа от последующего денежного значения. 13.2.5. Высокоуровневое числовое и денежное форматирование:
strfmon
и printf
После рассмотрения всех полей
struct lconv
вы можете поинтересоваться: «Нужно ли мне на самом деле выяснять, как использовать все эти сведения, просто для форматирования денежного значения?» К счастью, ответом является «нет». [140] Функция strfmon
делает за вас всю работу: #include <monetary.h> /* POSIX */
ssize_t strfmon(char *s, size_t max, const char *format, ...);
140
Мы так же счастливы, как и вы, поскольку нам не нужно представлять код, использующий эту полнофункциональную структуру — Примеч. автора.
Эта функция во многом подобна
strftime
(см. раздел 6.1.3.2 «Сложное форматирование времени: strftime
»), используя format
для копирования символов букв и форматированных числовых значений в s
, помещая в нее не более max символов. Следующая простая программа, ch13-strfmon.c
, демонстрирует работу strfmon
: /* ch13-strfmon.c --- демонстрация strfmon */
#include <stdio.h>
#include <locale.h>
#include <monetary.h>
int main(void) {
char buf[BUFSIZ];
double val = 1234.567;
setlocale(LC_ALL, "");
strfmon(buf, sizeof buf, "You owe me %n (%i)\n", val, val);
fputs(buf, stdout);
return 0;
}
При запуске в двух различных локалях она выдает такой результат:
$ LC_ALL=en_US ch13-strfmon /* В Соединенных Штатах */
You owe me $1,234.57 (USD 1,234.57)
$ LC_ALL=it_IT ch13-strfmon /* В Италии */
You owe me EUR 1.235 (EUR 1.235)
Как вы можете видеть,
strfmon
подобна strftime
, копируя обычные символы в буфер назначения без изменений и форматируя аргументы в соответствии со своими собственными спецификациями форматирования. Их всего три. %n
Вывести национальное (т.е. местное) представление значения валюты. %i
Вывести международное представление значения валюты. %%
Вывести символ '%
'. Форматируемые значения должны иметь тип
double
. Разницу между %n
и %i
мы видим в локали "en_US
": %n
использует символ $
, тогда как %i
использует USD, которая означает «доллары США».