Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
$ <b>LC_ALL=en_US ch13-quoteflag</b> /* Локаль с разделителем (англ.) */1,234,567На время написания лишь GNU/Linux и Solaris поддерживают флаг
'13.2.6. Пример: форматирование числовых значений в
gawkgawkprintf()sprintf()gawk'builtin.cgawkgawkstruct lconv1 case 'd':2 case 'i':3 ...4 tmpval = force_number(arg);56 ...7 uval = (uintmax_t)tmpval;8 ...9 ii = jj = 0;10 do {11 *--cp = (char)('0' + uval % 10);12 #ifdef HAVE_LOCALE_H13 if (quote_flag && loc.grouping[ii] && ++jj == loc.grouping[ii]) {14 *--cp = loc.thousands_sep[0]; /* XXX - предположение, что это один символ */15 if (loc.grouping[ii+1] == 0)16 jj = 0; /* продолжить использовать текущий val в loc.grouping [ii] */17 else if (loc.grouping[ii+1] == CHAR_MAX)18 quote_flag = FALSE;19 else {20 ii++;21 jj = 0;22 }23 }24 #endif25 uval /= 10;26 } while (uval > 0);(Номера строк даны относительно начала фрагмента.) Некоторые части кода, не имеющие отношения к обсуждению, были опущены, чтобы облегчить фокусировку на важных частях.
Переменная
locstruct lconvmain()loc.thousands_seploc.groupingCHAR_MAXС таким введением, давайте посмотрим на код. Строка 7 устанавливает
uvaliijjloc.groupingquote_flag'Цикл
do-whileНас интересуют строки 12–24. Эта работа осуществляется только на системе, поддерживающей локали, на что указывает наличие заголовочного файла
<locale.h>HAVE_LOCALEКогда условие в строке 13 истинно, настало время добавить символ разделителя тысяч. Это условие можно прочесть как «если требуется группировка и текущее положение в
loc.groupingПосле использования текущего положения в
loc.groupingjjCHAR_MAXquote_flagjjiiЭто низкоуровневый, подробный код. Однако, поняв один раз, как представляется информация в
struct lconv13.2.7. Форматирование значений даты и времени:
ctime()strftime()В разделе 6.1 «Времена и даты» описаны функции для получения и форматирования значений времени и даты. Функция
strftime()setlocale()ch13-times.с/* ch13-times.c --- демонстрация времени на основе локали */#include <stdio.h>#include <locale.h>#include <time.h>int main(void) { char buf[100];