Анимация
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

Оформление

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

Таблица 14.7. Функции фацета numpunct

Выражение Описание

np.decimaljDOintO Возвращает символ, используемый в качестве десятичной точки

np.thousand5 sep0 Возвращает символ разделения групп разрядов

np.groupingO Возвращает объект string с описанием позиций разделителей

np.tmenameO Возвращает текстовое представление значения true

np.falsenameO Возвращает текстовое представление значения false

В аргументе шаблона numpunct передается символьный тип charT. Символы, возвращаемые функциями decimaLpoint() и thousand sep(), относятся к этому типу, а функции truename() и falsename() возвращают baslc string<charT>. Обязательна поддержка двух специализаций numpunct<char> и numpunct<wchar t>.

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

1.000.000

к сожалению, такое представление используется не везде. Например, в Германии для разделения группы разрядов используется точка, поэтому немец запишет это же число в несколько ином виде:

1.000.000

Символ-разделитель определяется функцией thousands sep(). Но и этого недостаточно, поскольку в некоторых странах встречаются другие правила разделения разрядов. Например, в Непале один миллион записывается в виде:

10.00.000

В этом случае разные группы содержат разное количество цифр. В таких случаях может пригодиться строка, возврашдемая функцией grouplng(). Цифра в позиции с индексом i определяет количество разрядов в i-й группе, отсчет ведется от нуля с крайней правой группы. Если количество символов в строке меньше количества групп, размер последней заданной группы применяется повторно. Значение numericjlmlts<char>::max() определяет группу неограниченного размера, а при полном отсутствии групп используется пустая строка. В табл. 14.8 приведены примеры разного форматирования одного числа.



Таблица 14.6. Примеры разделения разрядов в одном миллионе Строка Результат

{ О } или "" (используется по умолчанию) 1000000

{ 3, О } или {\3} 1,000,000

{ 3, 2, 3, О } или "\3\2\3" 10,00,000

{ 2, CHAR MAX, О > 10000,00

Обратите внимание, что обычные цифры в данном случае практически бесполезны. Например, строка "2" для кодировки ASCH определяет группы в 50 цифр, потому что символу 2 в кодировке ASCII соответствует целочисленный код 50.

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

Фацет num put обеспечивает текстовое форматирование чисел. Он представляет собой шаблон класса с двумя аргументами: тип charT определяет символы, создаваемые при выводе, а тип Outit определяет итератор вывода для записи сгенерированных символов. По умолчанию итератор вывода относится к типу ostreambuf iterator<charT>. Фацет num put поддерживает семейство функций, которые называются put() и различаются только по последнему аргументу. Пример использования фацета num put:

std::locale loc: Dutit to = ...:

std::ios base& fmt = ...: CharT fill = ...:

T value = ...:

Получение фацета числового форматирования для контекста loc const std::num put<charT.DutIt>& np = std::use facet<std::num put<charT,OutIt> >(loc);

Вывод данных с использованием фацета np.put(to. fmt, fill, value);

Приведенный фрагмент строит текстовое представление значения value с помощью символов типа charT и выводит их через итератор вывода to. Формат вывода определяется флагами форматирования, хранящимися в fmt, а символ fill используется в качестве заполнителя. Функция put() возвращает итератор для позиции, следующей за последним из выведенных символов.

Фацет num put содержит функции для типов bool, long, unsigned long, double, long double и void*, передаваемых в последнем аргументе, и не содержит функций для таких типов, как short или int, но это не вызывает проблем, поскольку соответствующие значения базовых типов в случае необходимости автоматически преобразуются к поддерживаемым типам.

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



ная библиотека С++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тин итератора вывода. Конечно, стандарт не требует, чтобы эти специализации хранились в каждом локальном контексте, потому что в этом случае количество фацетов оказалось бы бесконечным.

Лексический разбор

Фацет num get предназначен для лексического разбора текстовых представлений чисел. По аналогии с num put он оформляется в виде шаблона с двумя аргументами: типом символов charT и типом итератора ввода Init, который по умолчанию равен istreambufJterator<charT>. Фацет поддерживает набор функций get(), различающихся только по типу последнего аргумента. Пример использования фацета numget:

std;:locale loc: Локальный контекст

Inlt beg =

Init end =

std: ;ios base& fmt •=

Начало входной лоследовательности

Конец входной последовательности

Поток, определяющий формат ввода

std::ios base::iostate err: Состояние после вызова

Т value = ...: Значение после успешного вызова

Получение фацета разбора числовых данных для контекста loc const std::num get<charT.lnlt>& ng = std:;use facet<std::nuni get<charT.Inlt> >(loc);

Чтение данных с использованием фацета ng.get(beg. end. fmt. err. value):

В этом фрагменте делается попытка выполнить разбор числового значения, соответствующего типу Т, из последовательности символов между beg и end. Формат предполагаемого числового значения определяется аргументом fint. Если разбор завершается неудачей, в переменной егг устанавливается флаг ios base::failbit; если все прошло нормально, состояние ios base::goodbit сохраняется в егг, а полученное значение - в value. Переменная value изменяется только в слзае успешного разбора. Если вся последовательность символов была полностью использована, функция get() возвращает второй параметр (end). В противном случае возвращается итератор, указывающий на первый символ, который не был обработан как часть числового значения.

Фацет num get содержит функции чтения для типов bool, long, unsigned short, unsigned int, unsigned long, float, double и long double. Некоторые из этих типов (например, unsigned short) не имеют соответствующих функций в фацете num put. Дело в том, что вывод значения типа unsigned short дает такой же результат, что и вывод значения типа unsigned short, приведенного к типу unsigned long. С другой стороны, чтение значения типа unsigned long с последующим преобразованием к unsigned short может дать результат, отличный от прямого чтения unsigned short.

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



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