Когда условие в строке 13 истинно, настало время добавить символ разделителя тысяч. Это условие можно прочесть как «если требуется группировка loc.grouping
указывает нужное для группировки количество
После использования текущего положения в loc.grouping
строки 15–22 заглядывают в значение в следующем положении. Если это 0, продолжает использоваться значение текущего положения. Мы указываем на это, восстанавливая 0 в jj
(строка 16). С другой стороны, если в следующем положении CHAR_MAX
, группировка должна быть прекращена, и строка 18 убирает ее, устанавливая quote_flag
в false. В противном случае, следующее значение является значением группировки, поэтому строка 20 восстанавливает 0 в jj
, а строка 21 увеличивает значение ii
.
Это низкоуровневый, подробный код. Однако, поняв один раз, как представляется информация в struct lconv
, код читать просто (и его было просто писать).
13.2.7. Форматирование значений даты и времени: ctime()
и strftime()
В разделе 6.1 «Времена и даты» описаны функции для получения и форматирования значений времени и даты. Функция strftime()
также может использовать локаль, если setlocale()
была вызвана должным образом. Это демонстрирует следующая простая программа, ch13-times.с
:
/* ch13-times.c --- демонстрация времени на основе локали */
#include
#include
#include
int main(void) {
char buf[100];
time_t now;
struct tm *curtime;
setlocale(LC_ALL, "");
time(&now);
curtime = localtime(&now);
(void)strftime(buf, sizeof buf,
"It is now %A, %B %d, %Y, %I:%M %p", curtime);
printf("%s\n", buf);
printf("ctime() says: %s", ctime(&now));
exit(0);
}
При запуске программы мы видим, что результаты strftime()
в самом деле варьируют, тогда как результаты ctime()
— нет:
$ LC_ALL=en_US ch13-times /* Время в Соединенных Штатах */
It is now Friday, July 11, 2003, 10:35 AM
ctime() says: Fri Jul 11 10:35:55 2003
$ LC_ALL=it_IT ch13-times /* Время в Италии */
It is now venerdi, luglio 11, 2003, 10:36
ctime() says: Fri Jul 11 10:36:00 2003
$ LC_ALL=fr_FR ch13-times /* Время во Франции */
It is now vendredi, juillet 11, 2003, 10:36
ctime() says: Fri Jul 11 10:36:05 2003
Причина отсутствия изменений в том, что ctime()
(и asctime()
, на которой основана ctime()
) является традиционным интерфейсом; он существует для поддержки старого кода, strftime()
, будучи более новым интерфейсом (первоначально разработанным для C89), свободен использовать локали.
13.2.8. Другие данные локали: nl_langinfo()
Хотя ранее мы сказали, что API catgets()
трудно использовать, одна часть этого API обычно полезна: nl_langinfo()
. Она предоставляет дополнительные связанные с локалью сведения, помимо тех, которые доступны из struct lconv
:
#include
#include
char *nl_langinfo(nl_item item);
Заголовочный файл
определяет тип nl_item
. (Это скорее всего int
или enum
.) Параметр item
является одной из именованных констант, определенных в
. Возвращаемое значение является строкой, которую можно при необходимости использовать либо непосредственно, либо в качестве форматирующей строки для strftime()
.
Доступная информация поступает из нескольких категорий локали. В табл. 13.3 перечислены константы элементов, соответствующие категории локали и их значения.
Таблица 13.3. Значения элементов для nl_langinfo()