Шаг 542.
Библиотека STL. Интернационализация. Числовое форматирование. Форматирование времени и даты. Форматирование

    На этом шаге мы рассмотрим функции, применяемые для форматирования даты и времени.

    Фацет time_put используется для форматирования времени и даты. Он представляет собой шаблон, в аргументах которого передаются тип символов charT и тип итератора вывода OutIt. По умолчанию итератор вывода относится к типу ostreambuf_iterator (смотри 511 шаг).

    В фацете time_put определены две функции put(), которые преобразуют дату, хранящуюся в объекте типа tm, в последовательность символов, записываемую через итератор вывода. Функции фацета time_put перечислены в таблице 1.

Таблица 1. Функции фацета time_put
Выражение Описание
tp.put(to, fmt, fill, t, cbeg, cend) Преобразует дату в соответствии со строкой [cbeg,cend)
tp.put(to, fmt, fill, t, cvt, mod) Преобразует дату с использованием спецификатора cvt

    Обе функции записывают результаты через итератор вывода to и возвращают итератор, установленный в позицию за последним выведенным символом. Аргумент fmt типа ios_base используется для работы с другими фацетами и передачи возможной дополнительной информации по форматированию. Символ fill используется для заполнения позиций. Аргумент t указывает на объект типа tm, содержащий форматируемую дату.

    Вторая версия put() форматирует дату из объекта tm, на который ссылается указатель t, интерпретируя аргумент out как спецификатор формата функции strftime(). Эта функция put() выполняет только одно преобразование - именно то, которое задано символом cut. Функция put() вызывается другой функцией put() для каждого обнаруженного спецификатора. Например, при вызове со спецификатором 'X' время, хранящееся в *t, выводится через итератор вывода. Смысл аргумента mod не задается стандартом. Предполагается, что этот аргумент должен влиять на выполняемое преобразование, как это делается в некоторых реализациях функции strftime().

    Версия put(), в которой для управления преобразованием используется строка в интервале [cbeg,cend), имеет много общего с strftime(). Она также сканирует строку и записывает все символы, не входящие в спецификацию преобразования, через итератор вывода to. Встречая спецификатор формата с префиксом %, функция извлекает спецификатор с необязательным модификатором, а затем вызывает другую версию put() и передает спецификатор с модификатором в двух последних аргументах. После возврата управления put() продолжает сканировать строку.

    Фацет time_put отличается от других тем, что в нем имеется невиртуальная функция put(), которая использует строку в качестве спецификатора преобразования. Эта функция не может переопределяться в классах, производных от time_put. Переопределение разрешено только для других функций put().

    Стандарт требует, чтобы в каждом локальном контексте хранились две специализации time_put<char> и time_put<wchar_t>. Кроме того, стандартная библиотека C++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символов (char или wchar_t), а во втором - тип итератора вывода. Не существует гарантированной поддержки для специализаций, у которых в первом аргументе шаблона передаются типы, отличные от char и wchar_t. Кроме того, не гарантировано, что по умолчанию в объектах локальных контекстов будут храниться какие-либо специализации помимо time_put<char> и time_put<wchar_t>.

    Со следующего шага мы начнем рассматривать форматирование денежных величин.




Предыдущий шаг Содержание Следующий шаг