Читаем Linux программирование в примерах полностью

Когда условие в строке 13 истинно, настало время добавить символ разделителя тысяч. Это условие можно прочесть как «если требуется группировка и текущее положение в loc.grouping указывает нужное для группировки количество и текущее число цифр равно группируемому количеству». Если это условие истинно, строка 14 добавляет символ разделителя тысяч. Комментарий обращает внимание на предположение, которое, вероятно, истинно, но которое может вновь появиться позже. ('XXX' является традиционным способом выделения опасного или сомнительного кода. Его легко отыскать, и он весьма заметен для читателя кода.)

После использования текущего положения в loc.grouping строки 15–22 заглядывают в значение в следующем положении. Если это 0, продолжает использоваться значение текущего положения. Мы указываем на это, восстанавливая 0 в jj (строка 16). С другой стороны, если в следующем положении CHAR_MAX, группировка должна быть прекращена, и строка 18 убирает ее, устанавливая quote_flag в false. В противном случае, следующее значение является значением группировки, поэтому строка 20 восстанавливает 0 в jj, а строка 21 увеличивает значение ii.

Это низкоуровневый, подробный код. Однако, поняв один раз, как представляется информация в struct lconv, код читать просто (и его было просто писать).

<p>13.2.7. Форматирование значений даты и времени: <code>ctime()</code> и <code>strftime()</code></p>

В разделе 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), свободен использовать локали.

<p>13.2.8. Другие данные локали: <code>nl_langinfo()</code></p>

Хотя ранее мы сказали, что 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()

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных