Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 223
Текст из файла (страница 223)
Операция ввода использует г для того, чтобы решить, как установить состояние своего потока. Если ошибок не обнаружено, то считанное значение присваивается г; в противном случае переменная г остается неизменной. Класс зетгу (часовой) обеспечивает гарантию выполнения всех префиксных и постфиксных операций потока 621.3.В). В частности, применение зеп(гу гарантирует, что мы начинаем читать, лишь если поток находится в надлежашем для чтения состоянии.
Разработчик язв еат может написать следуюшее: 1етр!азе<с!азз СА, с!ат Тг> Ы1геать зЫ::Ьаяс Ы(геат<СЬ, Тг>:: орегазог» (г!оиЫеь Н) ( зеп1гу 8иага (*1Ыз) 1 У см. ~2!.3.8 (1(!81гагй) ге1игп *1ЬЫ! Ф все хорошо гоззаге яаге = О; (зягеатЬиу Вега(ог<СЬ> еозг 1(оиЫе бб; 0.4. Стандартные фасеты 1039 згу ( изе 1асез<пит Вез<СЬ» (Вейос() ) .Вез(*йи,еоз, *йи,мазе,й() (1(ззте==О ( ) тазе==ео1ЬЬ) И = й1; зеизазе (тазе); ) сазсЬ (... ) ( ЬапВ!е Ыехсерйоп (*йи); 77 см. ВР.4.2.2 ) гетгп *(Ьи; ) В случае ошибки функция зеаиазе() сгенерирует исключения, определеннгяе для 1ззгеат (в21.3.6). Определив иитриисз, такой как, например, Му риис! из Взз.4.2, мы можем читать с использованием нестандартной пунктуации. Например; »оЫ1() ( сот « "зб1еА: 1пз «1; ВоиЫе И) сиз » 11» В1; 77 читаем по стандартному формату "!2345б7В" 1оса)е !ос (1оса!е:: с)азз!с (), пет Му рипсп ' сиз .
ЬпЬие ( !ос); сои! « "зту1е В: "; зпз «2; ВоиЫе В2; с(п»!1» И; ) В читаем по формату "12 345 б7В" Чтобы читать по-настоящему необычные числовые форматы, нам нужно заместить Фо Веты. Например, мы могли бы определить иит Вез для чтения римских цифр вроде ХХ1 нли ММ (5)3.6[! 5[). 0.4.3. Ввод и вывод финансовой информации Форматирование количества денег технически аналогично форматированию «просто чисел» (93.4.2).
Однако представление денежных величин еще более чувствительно к национальным стандартам и особенностям. Например, отрицательные значения (убыток, дебет), таких как — 1.25, должно в некоторых контекстах представляться положительными числами, заключенными в круглые скобки: (1.25). Аналогично, в других контекстах могут применять цвет для наглядного отображения отрицательных сумм денег.
Нет никакого стандартного «денежного типа». Вместо этого предполагается, что программист явным образом применит «денежные фасеты» к числовым величинам, про которые он знает, что они соответствуют денежным суммам. Например: 1040 Приложение (). Локализация с1ат Мопеу ( 1опя 1лГ атоип(Г ри611с: Мопеу()олл(пг«): атоипг(г) () орегагог 1оле 1пг () солт ( гегигл атоипм ) 77... гоЫ3'(1опл (лг г') ( сот « "га1ие= " «г' « "атолл~= " «Мопеу(1) «еп41) Денежные фасеты призваны упростить написание операции вывода для Мопсу, которая выводила бы денежные суммы в соответствии с национальными особенностями (соглашениями) (ВО.4.3.2). Результат вывода будет зависеть от того, какой 1оса1е закреплен за сои(. Вот возможные варианты форматов вывода: га1ие= 1234567 атолл(= З12345. 67 га(ие= 1234567 отоипт 12345, 6 7 1)КК га1ие= — 1234567 атоипг= З-12345.
67 га(ие= -1234567 атоипг= -З12345.67 га(ие= -1234567 атоипт ( СНГ12345, 67) Для денежных сумм считается важным учет, по возможности, самых малых монет. Поэтому я принял соглашение о представлении целым значением количества центов (пенсов, центов, копеек и т.д.), а не долларов (фунтов, евро, рублей и т.д.). Это соглашение поддерживается посредством функции угас йК(в () фасета тоиеурилсг (Вьг.4.3.1). Вид «десятичной точки» определяется при помощи Нес)- та1 ро1игО. Фасеты тоиеулег и тоиеу риг предоставляют функции, которые выполняют ввод/вывод на основе формата, определяемого фасетом толеу Ьазе.
Наш простой тип Моиеу может использоваться для управления форматами ввода/вывода или хранения денежных величин. В первом случае мы приводим к типу Моиеу иные типы, хранящие денежные суммы, непосредственно перед их записью, и читаем в переменные типа Моиеу перед их конвертированием в другие типы. Во втором случае мы исходно храним денежные суммы в переменных типа Молеу, что менее чревато ошибками, ибо нет необходимости выполнять преобразования при записи в потоки, и не надо преобразовывать прочитанные данные к форматам, учитывающим национальные особенности.
Но, к сожалению, не всегда можно внедрить тип Моиеу глубоко в программы, которые не разрабатывались с этой целью. Остается выполнять преобразования к типу Моиеу в операциях ввода/вывода. 0.4.3.1. Пунктуация денежных величин Фасет тоиеуриисг, управляющий представлением денежных величин, похож, естественно, на фасет питриисг, управляющий представлением «обычных чисел» (в)3.4.2.1): 3О4З 0.4. Стандартные фасеты с1ат яЫ:: толеу Ьаяе ( риЬ|с: елит рог< ( лоле, <расе, яутЬо1, я<ли, га<ие ); я<гис<раиегп ( сйаг!)еЫ [4] 1 ) 1 // части раскладки значения /У спецификация раскладки <етр<а<есс<аяя Сй, Ьоо! !п<егла<(опа1 = (а!яе> с<аяя я<д<: топеурипс<: риЫк <оса<е<:уасе<, риЫк топеу Ьаяе ( риЫ<с: <уре«е!' Сй сйаг <уре< <уре«еу Ьая(с я<гтл<СЬ> я<г!пл <уре< екр<1сй топеурипс<[я!яе 1 г = О); Сй «есйпа! ро<п<() сопя1; Сй <йоияапдя яер() соля<1 я<г!пе Кгоиртр () сопя<; /У '.
' в с!аи!с() // ', ' в с1аямс() // "" в с!аяяс() - означает "нет группировки" яМлл <уре сигг яутбо< () сопя<; я<г!пд 1уре роя!<!ге я<ли () солИ; я<г!пл <уре пела<!ые Ятп () соля<1 У "5" в с1аямс() // "" в с1аямсО /У "-" в с!аяя(с() // число цифр после десятичной точки; 2 в с1аяядс() <и<Як «!К!ь () сопя<1 У (яутЬо1, я<ел, попе, га!ие ) в с!аяяк() /У(яутбо1, я<оп, попе, га!ие ) в с!аямс() раиегп роя [огта< () сопя<1 раиегп пед (огта< () сопя<1 я<а<к сопя< Ьоо< тн = 1п<егпабопа!1 // применяем международ. денеж. форматы /'обьект идентификации фасета (яР.2, яР.З,ЗР.З.)) я<а«с <оса!в:: Ы Ы< рго<ес<е«: -толеурилс< () 1 //виртуальные ч!о "-функции (см. ЗР.4.!) )1 "(/И)" "ВКК" "Е(/1<" Последним символом является терминальный нуль.
Стандарт [Ю-42[7 определяет трехбуквенные идентификаторы валют. Когда Зп<егпаиопа! равен уа!яе, можно использовать локальные обозначения валют, вроде Ю и т.д. Средства, которые предлагает фасет топеурипс<, предназначены, в первую очередь, для разработчиков реализаций фасетов топеу ри< и топеу ко< 5[3.4.3.2, 50.4.3.3). Функции-члены <!ес(та1 роли[), <йоияап<1я яер() и Кгоир!пК() ведут себя так же, как их эквиваленты из питрипс<. Функции-члены сиге яутЬо1[), роипге я[Кп() и пеКайге я[Ки() возврашают строку, изображаюшую валюту [например, Ж, РМГ, РКК и т.д.), плюсовой знак и минусовой знак, соответственно. Если аргумент Зи<егпапоиа! шаблона равен <гие, то член 1п<! также будет равен иие, что повлечет за собой использование международных обозначений валютных символов.
Такие международные обозначения являются четырехсимвольными строками. Например: то42 Приложение О. Локализация Объект типа рапегп, возвращаемый функциями роз/опиа<() или иек /огта<(), состоит из четырех частей, определяюших последовательность, в которой отображаются числовое значение, валютный символ, символ знака (плюс или минус) и заполнители (пробельные символы). Наиболее общие форматы задаются тривиально с применением этого простого образца (рапегп) формата.
Например: Представление отрицательных значений с использованием скобок достигается, когда возврат функции пеяайые и!Кп() содержит пару символов (). Первый символ этой строки помешается туда, где часть я!ап располагается в образце, а остальная часть строки — после всех остальных частей образца. Наиболее распространенным применением этого средства является принятое в финансовых кругах заключение отрицательных денежных сумм в круглые скобки, но возможны и иные варианты применения. Например: -З123.45 УУ(я(епяутЬо!ыа!иелопе/ где пека!<ые я(ел() возвращает "-" * $123. 45 я!!!у У (я!еп,яутЬо1, ыа!ие,попе/ где лева<!ые я!япо возвращает "* я!!у" Каждое из значений я!ап, ыа1ие и яутйо! должно появиться в образце ровно один раз. Оставшееся значение может быть ирисе или попе.
В том месте, где в образце расположен зрасе, в отображаемом значении может появиться один или более пробельных символов. А где расположен попе (но не в конце образца) — там может быть нуль или более пробельных символов. Обратите внимание на то, что эти строгие правила запрешают такие на первый взгляд разумные образцы, как раиегп ра< = (я10л, ыа<ие, попе, попе ) ! УУ еп оп нету яутЬо( Функция угас <(!К!<з () указывает, где помещается <!ес!та! ро!и<(), Часто денежные суммы представляются в самых мелких валютных единицах (В<>.4.3).
Такая единица обычно в сто раз меньше основной валютной единицы (доллара, фунта, рубля и т.д.), и поэтому угас <5!а!<з() чаще всего возврашает 2. Приведем пример простого формата, оформленного в виде фасета: с1аия Му топеу 1о: риЫ1с топеурипс«сваг, <гие> ( риЫ!с: ехрдсПМу топеу (о(я(яе < г = О): топеурипс«сваг,<гие> (г) ( ) сваг 1уре 4о 4ес<та< ро<п! () сопя! (ге<игл ' .
'; ) сваг <уре 4о <Ьоияапдя иер() сот! (ге1игп ', '; ) яппя 4о Кгоир(ля() сот< (ге<игл "'~003~003',003" ! ) затая <уре до сигг яутьо<() сопя( (ге<игл "ЮЯР" ! ) я<пни <уре Ио роз<<<ге я<дл () сот< (ге<игл ""; ) я<пня <уре 4о ледовые я(дп () сот< (ге<игл " () "; ) е$123.45 зе123. 45 З123.45 $123. 45- -123. 45 РКК (З123.45) (123. 45РКК) У (я!еп, яутЬо1, гросс, ыа!ие/ где роя<гас я!еп() возвращает "+" У ( яутЬо!, я(ел, ыа!ие, лопе,) где роя«ые я!епо возвращает ие " УУ (яутЬо1, я!ел, ыа!ие, попе,) где роядые я!епр возвращает "" УУ ( иутЬо1, ыа!ие, я(ел, попе/ У(я!яп, ыа1ие, ирисе, яутЬо1/ У (я!ел, зутЬо!, ыа1ие, попе/ где пело«ые я!еп() возвращает "()" У(я!еп, ыа1ие, яутЬо1, лопе/ где леха<гас я!Кло возвращает "()" ().4.
Стандартные фасеты 1043 тг гго !гас гг!я!гз () сопя! (гегигп 2; ) уу две цифры после десятичной точки рапегп гго роз )огтаг() сопя! ( зтйсраиеги раг = (з!еп,зутЬо1, га!ие, попе) г ге!игл рагг ) рапегп гго иее 1огтаг() соля! ( згаяс раиегп раг = (з!ап, зутЬо1, га!ие, иоле) г ге!игл рагг ) )г Этот фасет используется в операциях ввода/вывода Мопеу, определенных в ~Р.4.3.2 и ~Р.4.3.3. Для пюпеурцпс( имеется и версия с суффиксом Ьупате (5Р.4, 5Р.4.1): гетр!аге<сгазз СЬ, Ьоо!!пг! = уагзе> с!азз зЫ::топеуринсг Ьулате: риЬВс толеурипсг<СЬ,)пг!> ()*...
*) ) г (з.4.3.2. Вывод денежных величин Фасет топеу риг записывает денежные суммы в соответствии с форматом, заданным птопеурцпс(. Более точно, топеу риг предоставляет функции риг(), которые помещают надлежац(им образом отформатированное представление символов в буфер потока: гетр!иге<с!азз СЬ, с1азз Огп = озггеатЬиг Ьегагог<СЬ» с!азз зиг:: тоиеуриг: риЫ!с госаге г:1асег ( риЫ!с: гуреде)' СЬ сЬаг гурег гурегге) Оиг Ьег гуре! гуреггеу'Ьазгс згг!ле<СЬ> згггпа гуре; ехрясв тоиеу риг (тге г г = 0) г У поместить значение на«в позицию буфера "Ь": Оигриг(Оиг Ь, Ьоог !игг, !оз Ьазеа з, СЬ11!1, 1оие ггоиЫе г) солзг; Отри!(ОигЬ, Ьоо! !пг1, !оз Ьазеа з, СЬ)!!1, сопят ягма (урез г) сопя!; згабс !оса!е::ЫЫг Угобъект идентификации фасета (ЗО2, з«>3, зь) 3!) ргогесгегг: -тоиеу риг() г У виртуальные луо "-функции (см.