#include
ssize_t strfmon(char *s, size_t max, const char *format, ...);
Эта функция во многом подобна strftime()
strftime()»), используя format для копирования символов букв и форматированных числовых значений в s, помещая в нее не более max символов. Следующая простая программа, ch13-strfmon.c, демонстрирует работу strfmon():/* ch13-strfmon.c --- демонстрация strfmon() */
#include
#include
#include
int main(void) {
char buf[BUFSIZ];
double val = 1234.567;
setlocale(LC_ALL, "");
strfmon(buf, sizeof buf, "You owe me %n (%i)\n", val, val);
fputs(buf, stdout);
return 0;
}
При запуске в двух различных локалях она выдает такой результат:
$ 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, обеспечивают повышенный контроль. Полные формы следующие:%[
%[
%% /* Не допускаются поля флагов, ширины и т.д. */
Флаги перечислены в табл. 13.2.
Таблица 13.2
. Флаги дляstrfmon()| Флаг | Значение |
|---|---|
=с | Использовать символ |
^ | Запретить использование символа группировки (например, запятой в Соединенных Штатах) |
( | Отрицательные значения заключать в скобки. Несовместим с флагом + |
+ | Обрабатывать положительные/отрицательные значения обычным образом. Использовать положительные и отрицательные знаки локали. Несовместим с флагом ( |
! | Не включать символ валюты. Этот флаг полезен, если вы хотите использовать strfmon() для более гибкого форматирования обычных чисел, чем это предусматривает sprintf() |
- | Выровнять результат слева. По умолчанию используется выравнивание справа. Этот флаг не действует без указания ширины поля |
Ширина поля является строкой десятичных цифр, представляющих минимальную ширину. По умолчанию использует столько символов, сколько необходимо, основываясь на оставшейся части спецификации. Значения, меньшие ширины поля, дополняются пробелами слева (или справа, если указан флаг '-
Точность слева состоит из символа #
=. Символы группировки не включаются в общий счет.Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT