На этом шаге мы рассмотрим средства, используемые для разбора значений денежных величин, представленных строкой.
Фацет 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, а во втором - тип итератора ввода. Хранение таких специализаций в каждом локальном контексте не обязательно.
Со следующего шага мы начнем рассматривать классификацию и преобразования символов.