Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

0 Количество и int_curr_symbol окружены скобками.

1 Строка знака до количества и int_curr_symbol.

2 Строка знака после количества и int_curr_symbol.

3 Строка знака непосредственно до int_curr_symbol.

4 Строка знака непосредственно после int_curr_symbol. */

 char int_p_sign_posn;

 char int_n_sign_posn;

};

Комментарии показывают довольно ясно, что происходит.

Давайте посмотрим на несколько первых полей
struct lconv
:

decimal_point

Используемый символ разделителя десятичной дроби. В Соединенных Штатах и других англоязычных странах это точка, но во многих странах используется запятая.

thousands_sep

Символ, используемый для разделения каждых 3 цифр значения.

grouping

Массив однобайтных целых значений. Каждый элемент указывает, сколько цифр в группе. Как сказано в комментарии,

CHAR_MAX
означает, что дальше группировка не используется, а 0 означает повторное использование последнего элемента (Далее в главе мы покажем пример кода.)

int_curr_symbol

Это международный символ для местной валюты. Например, 'USD' для доллара США.

currency_symbol

Локальный символ для местной валюты. Например, $ для доллара США.

mon_decimal_point
,
mon_thousands_sep
,
mon_grouping

Соответствуют предыдущим полям, предоставляя те же сведения, но для денежных сумм.

Большая часть оставшихся значений не имеет значения для повседневного программирования. Следующая программа,

ch13-lconv.c
, выводит некоторые из этих значений, чтобы дать вам представление, для какого рода сведений они используются:

/* ch13-lconv.c --- показывает некоторые компоненты struct lconv */

#include <stdio.h>

#include <limits.h>

#include <locale.h>

int main(void) {

 struct lconv l;

 int i;

 setlocale(LC_ALL, "");

 l = *localeconv;

 printf("decimal_point = [%s]\n", l.decimal_point);

 printf("thousands_sep = [%s]\n", l.thousands_sep);

 for (i = 0; l.grouping[i] != 0 && l.grouping[i] != CHAR_MAX; i++)

printf("grouping[%d] = [%dj\n", i, l.grouping[i]);

 printf("int_curr_symbol = [%s]\n", l.int_curr_symbol);

 printf("currency_symbol = f%s]\n", l.currency_symbol);

 printf("mon_decimal_point = f%s]\n", l.mon_decimal_point);

 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>

Поделиться:
Популярные книги

Адвокат Империи 10

Карелин Сергей Витальевич
10. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
попаданцы
5.00
рейтинг книги
Адвокат Империи 10

Сильнейший Столп Империи. Книга 4

Ермоленков Алексей
4. Сильнейший Столп Империи
Фантастика:
фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 4

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Жертва

Привалов Сергей
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Жертва

Эволюционер из трущоб. Том 9

Панарин Антон
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 9

Локки 2. Потомок бога

Решетов Евгений Валерьевич
2. Локки
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Локки 2. Потомок бога

Портрет дьявола: Собрание мистических рассказов

Скотт Вальтер
Проза:
классическая проза
8.09
рейтинг книги
Портрет дьявола: Собрание мистических рассказов

Помещик

Беличенко Константин
1. Помещик
Фантастика:
боевая фантастика
попаданцы
5.56
рейтинг книги
Помещик

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.56
рейтинг книги
Ботаник

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Сон демона

Брюссоло Серж
2. Пегги Сью и призраки
Детские:
детская фантастика
8.61
рейтинг книги
Сон демона

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга IV