Namespaces
Variants

std:: money_get

From cppreference.net
Определено в заголовочном файле <locale>
template <

class CharT,
class InputIt = std:: istreambuf_iterator < CharT >

> class money_get ;

Шаблон класса std::money_get инкапсулирует правила для разбора денежных значений из символьных потоков. Стандартный манипулятор ввода-вывода std::get_money использует аспект std::money_get локали потока ввода-вывода.

cpp/locale/locale/facet std-money get-inheritance.svg

Диаграмма наследования

Если специализация std::money_get не гарантированно предоставляется стандартной библиотекой (см. ниже), поведение её функций get() и do_get() не гарантируется в соответствии со спецификацией.

Содержание

Специализации

Стандартная библиотека гарантированно предоставляет следующие специализации (они должны быть реализованы любым объектом локали ):

Определено в заголовочном файле <locale>
std :: money_get < char > анализирует узкосимвольные строковые представления денежных значений
std :: money_get < wchar_t > анализирует широкосимвольные строковые представления денежных значений

Кроме того, стандартная библиотека также гарантированно предоставляет каждую специализацию, удовлетворяющую следующим требованиям к типам:

Вложенные типы

Тип Определение
char_type CharT
string_type std:: basic_string < CharT >
iter_type InputIt

Члены данных

Участник Описание
std::locale::id id [static] идентификатор аспекта

Функции-члены

создаёт новый money_get фасет
(публичная функция-член)
вызывает do_get
(публичная функция-член)

Защищенные функции-члены

уничтожает объект money_get фасета
(защищенная функция-член)
[virtual]
разбирает денежное значение из входного потока
(виртуальная защищенная функция-член)

Пример

#include <iomanip>
#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
int main()
{
    std::string str = "$1.11 $2.22 $3.33";
    std::cout << std::fixed << std::setprecision(2);
    std::cout << '\"' << str << "\" parsed with the I/O manipulator: ";
    std::istringstream s1(str);
    s1.imbue(std::locale("en_US.UTF-8"));
    long double val;
    while (s1 >> std::get_money(val))
        std::cout << val / 100 << ' ';
    std::cout << '\n';
    str = "USD  1,234.56";
    std::cout << '\"' << str << "\" parsed with the facet directly: ";
    std::istringstream s2(str);
    s2.imbue(std::locale("en_US.UTF-8"));
    auto& f = std::use_facet<std::money_get<char>>(s2.getloc());
    std::ios_base::iostate err;
    std::istreambuf_iterator<char> beg(s2), end;
    f.get(beg, end, true, s2, err, val);
    std::cout << val / 100 << '\n';
}

Вывод:

"$1.11 $2.22 $3.33" parsed with the I/O manipulator: 1.11 2.22 3.33
"USD  1,234.56" parsed with the facet directly: 1234.56

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 427 C++98 money_get гарантированно принимал любой CharT , который
соответствует требованиям для символа, на котором
может быть инстанцирован любой из компонентов iostream
гарантирует принятие только char ,
wchar_t и других определяемых
реализацией символьных типов
LWG 2392 C++98 только символьный тип CharT мог быть
гарантированно принят money_get
может гарантировать принятие определяемых
реализацией символьных контейнерных типов

Смотрите также

определяет параметры форматирования денежных величин, используемые std::money_get и std::money_put
(шаблон класса)
форматирует денежное значение для вывода в виде последовательности символов
(шаблон класса)
(C++11)
разбирает денежное значение
(шаблон функции)