Программирование >>  Операторы преобразования типа 

1 ... 219 220 221 [ 222 ] 223 224 225 ... 239


для полного названия, функция пытается прочитать полное название. Если это сделать не удается, разбор завершается неудачей, несмотря на успешный разбор сокращенного названия.

В стандарте не сказано, должны ли при разборе года поддерживаться обозначения из двух цифр. Также не определено, какой именно год должен сопоставляться такому сокращению.

Функция date order() возвращает порядок следования дня, месяца и года в строке даты. Это необходимо для некоторых дат, которые не позволяют определить нужный порядок по текстовому представлению даты. Например, 1 февраля 2003 года может выводиться как в виде 3/2/1, так и в виде 1/2/3. В классе time base, базовом для фацета time get, определен перечисляемый тип dateorder с возможными порядками следования компонентов даты. Значения этого типа перечислены в табл. 14.11.

Таблица 14.11. Значения перечисляемого типа dateorder Значение Описание

no order Определенный порядок отсутствует (например, дата по юлианскому календарю) dmy День, месяц, год

mdy Месяц, день, год

ymd Год, месяц, день

ydm Год, день, месяц

Стандарт требует, чтобы в каждом локальном контексте хранились две специализации time get<char> и tim€ get<wchar t> (в обеих специализациях для второго аргумента используется значение по умолчанию). Кроме того, стандартная библиотека С++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора ввода. Стандарт не требует, чтобы эти специализации хранились в каждом локальном контексте.

Формати рова ние

Фацет time put используется для форматирования времени и даты. Он представляет собой шаблон, в аргументах которого передаются тип символов charT и тип итератора вывода Outlt. По умолчанию итератор вывода относится к типу ostreambuf Jterator (см. с. 638).

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

Таблица 14.12. Функции фацета 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, на который ссылается указатель интерпретируя аргумент cvt как спецификатор формата функции strftime(). Эта функция put() выполняет только одно преобразование - именно то, которое задано символом cvt. Функция put() вызывается другой фзшкцией putO для каждого обнаруженного спецификатора. Например, при вызове со спецификатором X время, хранящееся в *t, выводится через итератор вывода. Смысл аргумента mod не задается стандартом. Предполагается, что этот аргумент должен влиять на выполняемое преобразование, как это делается в некоторых реализациях функции strftime().

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

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

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

Форматирование денежных величин

в категорию monetary входят фацеты moneypunct, money get и money put. Фацет moneypunct определяет формат денежных величин, а два других фацета используют эту информацию для их форматирования или лексического разбора.

Оформление

Вид выводимых денежных величин определяется локальным контекстом. Форматы, используемые в разных культурных сообществах, очень отличаются друг от друга. В частности, различаются обозначения денежных единиц (которые



могут вообще отсутствовать), способы записи отрицательных и положительных сумм, режимы использования национального или международного обозначения денежной единицы, разделители групп разрядов и т. д. Чтобы обеспечить необходимую гибкость, атрибуты формата были выделены в фацет moneypunct.

Фацет moneypunct представляет собой шаблон с двумя аргументами: типом charT и логическим признаком, по умолчанию равным false. Логический признак показывает, должно ли использоваться национальное (false) или международное (true) обозначение денежной единицы. Функции фацета moneypunct перечислены в табл. 14.13.

Таблица 14.13. Функции фацета moneypunct Выражение Описание

mp.declmal point() Возвращает символ, используемый в качестве десятичной точки mp.thousand sep() Возвращает символ, используемый для разделения групп разрядов mp.groupingO Возвращает строку, определяющую размеры групп разрядов

mp.curr symbol() Возвращает строку с обозначением денежной единицы mp.positJve sign() Возвращает строку с обозначением знака положительного числа mp.negative sign() Возвращает строку с обозначением знака отрицательного числа mp.frac digits() Возвращает количество цифр в дробной части

mp.pos format() Возвращает формат неотрицательных значений

mp.neg format() Возвращает формат отрицательных значений

Класс moneypunct объявлен производным от класса money base. В этом базовом классе определен перечисляемый тип part, представляющий компоненты шаблона форматирования денежных величин. Кроме того, в нем определен тип pattern (синоним для char[4]). Четыре значения типа part, хранящихся в этом типе, определяют структуру денежной величины. В табл. 14.14 перечислены пять допустимых значений типа part, которые могут использоваться в значениях типа pattern.

Таблица 14.14. Компоненты шаблонов форматирования денежных величин

Значение Описание

попе В данной позиции могут находиться необязательные пробелы

space В данной позиции обязателен хотя бы один пробел

sign В данной позиции может находиться знак

symbol В данной позиции может находиться обозначение денежной единицы

value В данной позиции выводится значение

В фацете moneypunct определены две функции, возвращающие шаблоны форматирования: neg format() для отрицательйых значений и pos fornwt() для неотрицательных значений. Шаблон форматирования содержит обязательные компоненты



1 ... 219 220 221 [ 222 ] 223 224 225 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика