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

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

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

$ 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, которая означает «доллары США».

Гибкость — и соответственно определенная сложность — сопровождают многие функции API, разработанные для POSIX, и

strfmon
не является исключением. Как и с
printf
, несколько необязательных элементов, которые могут быть между
%
и
i
или
n
, обеспечивают повышенный контроль. Полные формы следующие:

%[флаги][ширина поля][#точность_слева][.точность_справа]i

%[флаги][ширина поля][#точность_слева][.точность_справа]n

%% /* Не допускаются поля флагов, ширины и т.д. */

Флаги перечислены в табл. 13.2.

Таблица 13.2. Флаги для

strfmon

Флаг Значение
Использовать символ с в качестве символа числового заполнения слева. Символом по умолчанию является пробел. Обычной альтернативой является 0
^
Запретить использование символа группировки (например, запятой в Соединенных Штатах)
(
Отрицательные значения заключать в скобки. Несовместим с флагом
+
+
Обрабатывать положительные/отрицательные значения обычным образом. Использовать положительные и отрицательные знаки локали. Несовместим с флагом
(
!
Не включать символ валюты. Этот флаг полезен, если вы хотите использовать
strfmon
для более гибкого форматирования обычных чисел, чем это предусматривает
sprintf
Выровнять результат слева. По умолчанию используется выравнивание справа. Этот флаг не действует без указания ширины поля

Ширина поля является строкой десятичных цифр, представляющих минимальную ширину. По умолчанию использует столько символов, сколько необходимо, основываясь на оставшейся части спецификации. Значения, меньшие ширины поля, дополняются пробелами слева (или справа, если указан флаг '

').

Точность слева состоит из символа

#
и строки десятичных цифр. Она указывает минимальное число цифр, которые должны быть слева от десятичного символа-разделителя дробной части [141] ; если преобразованное значение меньше этого, результат выравнивается символом числового заполнения. По умолчанию используется пробел, однако для его изменения можно использовать флаг
=
. Символы
группировки не включаются в общий счет.

141

В стандарте используется технический термин radix point (позиционный разделитель), поскольку числа с другим основанием счисления также могут иметь дробные части. Однако, для денежных значений можно довольно безопасно использовать термин 'decimal point' (десятичный разделитель) — Примеч. автора.

Наконец, точность справа состоит из символа '

.
' и строки десятичных цифр. Она указывает, с каким числом значащих цифр округлить значение до форматирования. По умолчанию используются поля
frac_digits
и
int_frac_digits
в
struct lconv
. Если это значение равно 0, десятичная точка не выводится.

strfmon
возвращает число символов, помещенных в буфер, не включая завершающий нулевой байт. Если недостаточно места, функция возвращает -1 и устанавливает
errno
в
E2BIG
.

Помимо

strfmon
, POSIX (но не ISO С) предусматривает специальный флаг — символ одинарной кавычки,
'
— для форматов
printf
%i
,
%d
,
%u
,
%f
,
%F
,
%g
и
%G
. В локалях, имеющих разделитель тысяч, этот флаг добавляет и его. Следующая простая программа,
ch13-quoteflag.c
, демонстрирует вывод:

/* ch13-quoteflag.c --- демонстрация флага кавычки printf */

#include <stdio.h>

#include <locale.h>

int main(void) {

 setlocale(LC_ALL, ""); /* Это нужно, иначе не будет работать */

 printf("%'d\n", 1234567);

return 0;

}

Вот что происходит для двух различных локалей: в одной есть разделитель тысяч, в другой нет:

$ LC_ALL=C ch13-quoteflag /* Обычное окружение без разделителя */

1234567

$ LC_ALL=en_US ch13-quoteflag /* Локаль с разделителем (англ.) */

1,234,567

На время написания лишь GNU/Linux и Solaris поддерживают флаг

'
. Дважды проверьте справочную страницу printf(3) на своей системе.

13.2.6. Пример: форматирование числовых значений в

gawk

gawk
реализует свои собственные версии функций
printf
и
sprintf
. Для полного использования локали
gawk
должен поддерживать флаг
'
, как в С. Следующий фрагмент из файла
builtin.c
в
gawk
3.1.4 показывает, как
gawk
использует
struct lconv
для числового форматирования:

1 case 'd':

2 case 'i':

3 ...

4 tmpval = force_number(arg);

5

6 ...

7 uval = (uintmax_t)tmpval;

8 ...

9 ii = jj = 0;

10 do {

11 *--cp = (char)('0' + uval % 10);

12 #ifdef HAVE_LOCALE_H

13 if (quote_flag && loc.grouping[ii] && ++jj == loc.grouping[ii]) {

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

Артефактор. Возвращение блудного императора

Седых Александр Иванович
2. Артефактор
Фантастика:
фэнтези
боевая фантастика
4.33
рейтинг книги
Артефактор. Возвращение блудного императора

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

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

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

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4

Курс 1. Ноябрь

Фокс Гарри
3. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Ноябрь

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Шайтан Иван 3

Тен Эдуард
3. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Шайтан Иван 3

Геном хищника. Книга шестая

Гарцевич Евгений Александрович
6. Я - Легенда!
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Геном хищника. Книга шестая

Третий Генерал: Том IV

Зот Бакалавр
3. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Третий Генерал: Том IV

Наследие Маозари 2

Панежин Евгений
2. Наследие Маозари
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 2