Spec-Zone.ru › C++

std::money_get

Определено в заголовке <locale>
template< 
    class CharT,
    class InputIt = std::istreambuf_iterator<CharT>
> class money_get;

Шаблон класса std::money_get encapsulates the rules for parsing monetary values from character streams. Стандартный манипулятор ввода-вывода std::get_money использует компонент std::money_get локале потока ввода-вывода.

cpp/locale/locale/facetstd-money get-inheritance.svg

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

Если специализация 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

Члены-функции

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

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

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

Объекты-члены

статический std::locale::id id
id локале
(публичный объект-член)

Пример

#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 Применено к Поведение, опубликованное Правильное поведение
LWG 427 C++98 money_get мог принять любой CharT, который удовлетворяет
требованиям для символа, на котором могут быть созданы
любые компоненты iostream
только гарантирует принятие
char и wchar_t, другие типы
определяются реализацией

См. также

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/w/cpp/locale/money_get

Spec-Zone.ru

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