Шаг 545.
Библиотека STL. Интернационализация. Форматирование денежных величин. Лексический разбор

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

    Фацет money_get предназначен для разбора текстовых представлений денежных величин. Он представляет собой шаблон с двумя аргументами: типом символов charT и типом итератора ввода InIt, который по умолчанию равен istreambuf_iterator<charT>. В классе определены две функции get(), которые пытаются разобрать вводимое значение и, если попытка завершается успешно, сохраняют результат в переменной типа long double или basic_string<charT>. Пример использования фацета money _get:

// Получение фацета разбора денежных величин для контекста lос 
const std::money_get<charT,InIt>& mg 
  = std::use_facet<std::money_get<charT,InIt> >(loc);
// Чтение данных с использованием фацета 
mg.get(beg, end, fmt, err, value);

    Разбираемая последовательность символов находится между значениями, заданными аргументами beg и end. Разбор прекращается после обработки всех элементов или при ошибке. Если разбор завершается неудачей, в переменной err устанавливается флаг ios_base::failbit, а в переменной, задаваемой в аргументе val, ничего не сохраняется. В случае успешного выполнения результат сохраняется в переменной типа long double или basic_string, передаваемой по ссылке в аргументе val.

    Аргумент intl содержит логический признак выбора обозначения денежной единицы (национального или международного). Фацет moneypunct, определяющий формат разбираемого значения, задается для объекта локального контекста, связанного с аргументом fmt. При разборе денежных величин всегда используется шаблон форматирования, возвращаемый функцией neg_fоrmat() фацета moneypunct.

    В позиции none или space функция, выполняющая разбор денежной величины, обрабатывает все доступные символы (кроме ситуации, когда тщту находится в последней позиции шаблона форматирования). Завершающие пробелы не игнорируются. Функции get() возвращают итератор, установленный в позицию за последним обработанным символом.

    Стандарт требует, чтобы в каждом локальном контексте хранились специализации money_get<char> и money_get<wchar_t>. Кроме того, стандартная библиотека C++ поддерживает все специализации, у которых в первом аргументе шаблона передается тип char или wchar_t, а во втором - тип итератора ввода. Хранение таких специализаций в каждом локальном контексте не обязательно.

    Со следующего шага мы начнем рассматривать классификацию и преобразования символов.




Предыдущий шаг Содержание Следующий шаг