C++. Сборник рецептов - [178]

Шрифт
Интервал

> if (moneyWriter.put(out, intl, out, out.fill(), val).failed())

>  throw "Couldn't write money!\n";

>}


>int main() {

> long double val = 0;

> float exchangeRate = 0.775434f; // Курс доллара по отношению к евро

> locale locEn("english");

> locale locFr("french");

> cout << "Dollars: ";

> cin.imbue(locEn);

> val = readMoney(cin, false);

> cout.imbue(locFr);

> // Установить флаг showbase, чтобы выводить символ валюты

> cout.setf(ios_base::showbase);

> cout << "Euros: ";

> writeMoney(cout, val = exchangeRate, true);

>}

Если выполнить программу примера 13.6, можно получить следующий результат.

>Dollars: $100

>Euros: EUR77,54

Обсуждение

Фасеты >money_put и >money_get записывают форматированные денежные значения в поток и считывают их из потока. Они работают почти так же, как фасеты даты/времени и числовые фасеты, описанные в предыдущих рецептах. Стандарт требует, чтобы были их реализации для стандартных символов и расширенного набора символов, например >money_put и >money_put. Как и для других фасетов, функции записи и чтения многословны, но, применив их несколько раз, легко запоминаешь параметры. >money_get и >money_put используют класс >moneypunct, содержащий информацию о форматировании.

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

Вы создаете объект >money_put с типом символа и локализацией следующим образом.

>const money_put& moneyWriter =

> use_facet >(out.getloc());

Стандарт требует наличия версий как для >char, так и для >wchar_t. Разумно использовать локализацию потока, в который осуществляется запись, чтобы избежать несогласованности, возникающей при попытке синхронизации потока и объекта >money_put. На следующем шаге вызовите метод put для записи денежного значения в поток вывода.

>if (moneyWriter.put(out, // Итератор вывода

> intl,                   // bool: использовать формат intl?

> out,                    // ostream&

> out.fill(),             // использовать символ заполнителя

> val)                    // денежное значение, тип long double

>.failed()) throw "Couldn't write money!\n";

Функция >money_put::put записывает денежное значение в переданный ей поток вывода, используя локализацию, с которой был создан объект >money_put. >money_put::put возвращает итератор >ostreambuf_iterator, который ссылается на позицию за последним выведенным символом; этот итератор имеет функцию-член >failed, позволяющую зафиксировать ситуацию, когда итератор оказывается испорченным.

Все параметры >money_put::put не требуют дополнительных пояснений, кроме, возможно, второго (аргумент >intl в примере). Он имеет тип >bool и показывает, будет использоваться символ валюты (например, $, €) или трехбуквенное международное обозначение валюты (например, USD, EUR). Для использования символа валюты установите его в значение >false, а для использования международного обозначения валюты — в значение >true.

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

>ios_base::internal

Если при форматировании денежного значения задается пробел или пустое значение, будет использован символ заполнителя (а не пробел). Ниже при обсуждении >moneypunct приводятся дополнительные сведения по шаблонам форматирования.

>ios_base::left и >ios_base::right

Выравнивает денежное значение влево или вправо; при этом остальные позиции в пределах заданной ширины заполняются символом заполнителя (см. описание следующего параметра, >width). Это удобно, потому что облегчает табуляцию денежного значения.

>ios_base::width

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

>ios_base::showbase

Если этот флаг имеет значение «истина», символ валюты выводится, в противном случае он не выводится.

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

Пример 13.7. Вывод информации о форматировании денежных значений

>#include

>#include

>#include


>using namespace std;


>string printPattern(moneypunct::pattern& pat) {

> string s(pat.field); // pat.field имеет тип char[4]


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.