На этом шаге мы рассмотрим способы форматирования денежных величин при выводе.
Фацет money_put обеспечивает форматирование денежных величин при выводе. Он представляет собой шаблон, в аргументах которого передаются тип символов charT и тип итератора вывода OutIt. По умолчанию итератор вывода относится к типу ostreambuf_iterator. Две функции put() генерируют последовательность символов в соответствии с форматом, определяемым фацетом moneypunct. Форматируемое значение передается в виде типа long double или basic_string<charT>. Пример использования фацета:
// Получение фацета money_put для локального контекста lос const std::money_put<charT,OutIt>& mp = std::use_facet<std::money_put<charT,OutIt> >(loc); // Вывод данных с использованием фацета mp.put(to, intl, fmt, fill, value);
Аргумент to содержит итератор вывода типа OutIt, через который записывается отформатированная строка. Функция put() возвращает объект этого типа, установленный в позицию за последним сгенерированным символом. Аргумент intl определяет используемое обозначение денежной единицы (национальное международное). Аргумент fmt определяет флаги форматирования, в том числе ширину поля и фацет moneypunct, задающий формат выводимого значения. Символ fill используется в качестве заполнителя.
Аргумент value относится к типу long double или basic_string<charT>; в нем передается форматируемое значение. Если аргумент передается в строковом виде, строка может содержать только десятичные цифры и, возможно, минус в начале числа. Если строка начинается с минуса, то значение форматируется как отрицательное. После того как функция определяет отрицательное число, начальный минус отбрасывается. Количество цифр в дробной части определяется функцией frac_digits() фацета moneypunct.
Стандарт требует, чтобы в каждом локальном контексте хранились специализации money_put<char> и money_put<wchar_t>. Кроме того, стандартная библиотека C++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора вывода. Хранение таких специализаций в каждом локальном контексте не является обязательным.
На следующем шаге мы рассмотрим лексический разбор.