|
Программирование >> Операторы преобразования типа
Sign, symbol и value и один из двух компонентов попе или space. Впрочем, это не означает, что в итоге действительно будет выведен знак или символ денежной единицы. Содержимое соответствующих позиций зависит от значений, возвращаемых другими функциями фацета, и от форматных флагов, передаваемых функциям форматирования. В денежной величине заведомо присутствует только значение. Естественно, оно находится в позиции, обозначенной компонентом value шаблона форматирования. Значение содержит точно frac digits() цифр в дробной части, а в качестве десятичной точки используется символ decimaLpoint() (если дробная часть отсутствует, десятичная точка ие ставится). При вводе денежных величин во входных данных могут присутствовать разделители групп разрядов. Если разделители присутствуют, правильность их расположения проверяется при помощи функции grouping(). Если функция grouping() возвращает пустую строку, присутствие разделителей фупп недопустимо. Группы разрядов разделяются символом, возвращаемым функцией thousands sep() Группировка производится по тем же правилам, как при числовом форматировании (см. с. 678). При выводе денежных величин разделители групп разрядов всегда вставляются в соответствии со строкой, возвращаемой функцией grouping(). При чтении денежных величин разделители групп не обязательны, если строка группировки не является пустой. Правильность расположения разделителей проверяется после успешного завершения разбора. Компоненты space и попе управляют расположением пробелов. Компонент space используется в позиции, в которой должен присутствовать по крайней мере один пробел. В процессе форматирования, если в форматных флагах установлен флаг ios base::lnternal, в позиции компонента space или попе вставляются символы-заполнители. Конечно, заполнение производится только в том случае, если заданная минимальная ширина не заполнена другими символами. Символ-заполнитель передается в аргументе функций форматирования денежных величин. Если отформатированное значение не содержит пробелов, попе может находиться в последней позиции шаблона форматирования. Компоненты space и попе не могут находиться в первой позиции шаблона форматирования, а space не может находиться в последней позиции. Знак денежной величины (положительный/отрицательный) может представляться несколькими символами. Например, в некоторых контекстах отрицательные суммы заключаются в круглые скобки. В позиции компонента sign в шаблоне форматирования выводится первый символ представления знака, остальные символы выводятся в конце после всех остальных компонентов. Если представление знака равно пустой строке, знак не отображается. Символьное представление знака определяется функцией positive sign() для неотрицательных величин и функцией negative sign() для отрицательных. В позиции компонента symbol отображается символ денежной единицы. Оно присутствует только в том случае, если среди форматных флагов, используемых при выводе или разборе, установлен флаг ios base.:showbase. В качестве представления денежного знака используется строка, возвращаемая функцией curT symbol(). Если второй аргумент шаблона равен falste (по умолчанию), то задействуется национальное обозначение денежной единицы; иначе - международное обозначение. В табл. 14.15 приведены примеры форматирования суммы $-1234.56. Конечно, предполагается, что frac digits() возвращает 2, Кроме того, во всех случаях используется нулевая ширина поля. Таблица 14.15. Примеры использования шаблонов форматирования Шаблон форматирования Знак
Стандарт требует, чтобы в каждом локальном контексте хранились специализации moneypunct<char>, moneypunct<wchar t>, moneypunct<char,true> и moneypunct <wchar t,tnje>. Стандартная библиотека С++ не поддерживает другие специализации. Форматирование Фацет money put обеспечивает форматирование денежных величин при вьгеоде. Он представляет собой шаблон, в аргументах которого передаются тип символов charT и тип итератора вывода Outlt. По умолчанию итератор вывода относится к типу ostreambuf iterator. Две функции put() генерируют последовательность символов в соответствии с форматом, определяемым фацетом moneypunct. Форматируемое значение передается в виде типа long double или basic string<charT>. Пример использования фацета: Получение фацета money put для локального контекста loc const std::money put<charT.OutIt>& mp = std::use facet<std::money put<charT.OutIt> >(loc): Вывод данных с использованием фацета mp.put(to. Intl. fmt. fill, value): Аргумент to содержит итератор вывода типа Outlt, через который записывается отформатированная строка. Функция put() возвращает объект этого типа, установленный в позицию за последним сгенерированным символом. Аргумент inti определяет используемое обозначение денежной единицы (национальное международное). Аргумент fmt определяет флаги форматирования, в том числе ширину поля и фацет moneypunct, задающий формат выводимого значения. Символ fill используется в качестве заполнителя. Аргумент value относится к типу long double или basic string<charT>; в нем передается форматируемое значение. Если аргумент передается в строковом виде, строка может содержать только десятичные цифры и, возможно, минус в начале числа. Если строка начинается с минуса, то значение форматируется как отрицательное. После того как функция определяет отрицательное число, начальный минус отбрасывается. Количество цифр в дробной части определяется функцией frac digits() фацета moneypunct. Стандарт требует, чтобы в каждом локальном контексте хранились специализации money put<char> и money put<wchar t>. Кроме того, стандартная библиотека С++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора вывода. Хранение таких специализаций в каждом локальном контексте не является обязательным. Лексический разбор Фацет money get предназначен для разбора текстовых представлений денежных величин. Он представляет собой шаблон с двумя аргументами; типом символов chart и типом итератора ввода Init, который по умолчанию равен istreambuf lterator<charT>. В классе определены две функции get(), которые пытаются разобрать вводимое значение и, если попытка завершается успешно, сохраняют результат в переменной типа long double или basic string<charT>. Пример использования фацета money get: Получение фацета раэбора денежных величин для контекста loc const std::money get<charT.InIt>& mg = std::use facet<std::money get<charT.Inlt> >(loc); Чтение данных с использованием фацета mg.get(beg. end. fmt, err. value); Разбираемая последовательность символов находится между значениями, заданными аргументами beg и end. Разбор прекращается после обработки всех элементов или при ошибке. Если разбор завершается неудачей, в переменной егг устанавливается флаг ios base::failbit, а в переменной, задаваемой в аргументе val, ничего не сохраняется. В случае успешного выполнения результат сохраняется в переменной типа long double или basic strlng, передаваемой по ссылке в аргументе val. Аргумент inti содержит логический признак выбора обозначения денежной единицы (национального или международного). Фацет moneypunct, определяющий формат разбираемого значения, задается для объекта локального контекста, связанного с аргументом fmt При разборе денежных величин всегда используется шаблон форматирования, возвращаемый функцией neg fbnnat() фацета moneypunct В позиции попе или space функция, выполняющая разбор денежной величины, обрабатывает все доступные символы (кроме ситуации, когда попе находится в последней позиции шаблона форматирования). Завершающие пробелы не игнорируются. Функции get() возвращают итератор, установленный в позицию за последним обработанным символом. Стандарт требует, чтобы в каждом локальном контексте хранились специализации money get<char> и money get<wchar t>. Кроме того, стандартная биб-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |