Spec-Zone.ru › C++

std::money_get

Определён в заголовочном файле <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 (см. ниже), поведение её get() и do_get() не гарантируется в соответствии со спецификацией.

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

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

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

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

  • CharT является одним из следующих типов:
    • char,
    • wchar_t и
    • любой другой определяемый реализацией тип символьного контейнера, который удовлетворяет требованиям к символу, для которого могут быть созданы любые компоненты iostream; и
  • InputIt должен удовлетворять требованиям LegacyInputIterator.

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

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

Поля данных

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

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

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

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

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

Пример

#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++.

Отчёт об ошибке Применён к Опубликованное поведение Правильное поведение
LWG 427 C++98 money_get гарантированно принимал любой CharT,
который удовлетворяет требованиям к символу, для которого
могут быть созданы любые компоненты iostream
гарантируется приём только char,
wchar_t и других определяемых
реализацией символьных типов
LWG 2392 C++98 гарантированно принимался только символьный тип CharT
для money_get
может быть гарантирован приём определяемых
реализацией типов символьных контейнеров

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/money_get

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API