Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 [ 222 ] 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

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

Вторая версия put() форматирует дату из объекта tm, на который ссылается указатель t, интерпретируя аргумент 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.gnsupingO Возвращает строку, определяющую размеры групп разрядов

mp.curr symbol() Возвращает строку с обозначением денежной единицы mp.positive 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() для неотрицательных значений. Шаблон форматирования содержит обязательные компоненты



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. В качестве представления денежного знака используется строка, возвращаемая функцией cun-symboK). Если второй аргумент шаблона равен falste (по умолчанию), то задействуется национальное обозначение денежной единицы; иначе - международное обозначение.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 [ 222 ] 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239