Namespaces
Variants

std::money_get<CharT,InputIt>:: get, do_get

From cppreference.net
std::money_get
Member functions
money_get::get money_get::do_get
Определено в заголовке <locale>
public :

iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(1)
iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(2)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(3)
virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(4)

Разбирает денежное значение из входного итератора и записывает результат в long double или строку.

1,2) Публичные функции-члены, вызывают функцию-член do_get наиболее производного класса.
3,4) Считывает символы из входного итератора beg , ожидая найти денежное значение, отформатированное согласно правилам, указанным фацетом std:: ctype , внедренным в str. getloc ( ) ( ct для остальной части этой страницы), фацетом std:: moneypunct < CharT, intl > , внедренным в str. getloc ( ) ( mp для остальной части этой страницы), и флагами форматирования потока, полученными из str. flags ( ) .

Если входной итератор beg становится равным end до завершения разбора, устанавливает оба бита failbit и eofbit в err . Если разбор завершается неудачно по другой причине, устанавливает failbit в err . В любом случае, при ошибке не изменяет выходной параметр ( units или digits ).

Если разбор завершается успешно, не изменяет err и сохраняет результат в units или digits .

Форматирование pattern используемое этой функцией всегда mp. neg_format ( ) .

Если mp. grouping ( ) не разрешает разделители тысяч, первый встреченный разделитель рассматривается как ошибка парсинга, в противном случае они рассматриваются как опциональные.

Если money_base::space или money_base::none является последним элементом в pattern , парсер не пытается обработать какие-либо пробельные символы после того, как другие компоненты денежного значения были разобраны. В противном случае, один или более пробельных символов обрабатываются там, где money_base::space присутствует.

Если флаг showbase установлен в str. flags ( ) , символ валюты или строковое представление валюты обязательно; если флаг не установлен, символ валюты является опциональным.

Если первый символ строки, возвращаемой mp. positive_sign ( ) или mp. negative_sign ( ) обнаруживается в позиции money_base::sign шаблона форматирования, он потребляется, а остальные символы этой строки ожидаются и потребляются после всех остальных компонентов денежного значения. Если обе строки mp. positive_sign ( ) и mp. negative_sign ( ) непустые, знак обязателен и должен совпадать с первым символом одной из этих строк. Если одна из этих строк пуста, знак опционален (и при его отсутствии знак результата соответствует строке, которая была пустой). Если обе строки пусты или имеют одинаковый первый символ, результату присваивается положительный знак. Если выходной параметр является строкой ( digits ) и результат отрицательный, значение ct. widen ( '-' ) сохраняется как первый символ результата.

Цифры из входных данных извлекаются в порядке их появления и помещаются в digits (после расширения с помощью ct. widen ( ) при необходимости), или во временный буфер buf1 , из которого значение units конструируется как если бы

static const char src[] = "0123456789-";
CharT atoms[sizeof(src)];
ct.widen(src, src + sizeof(src) - 1, atoms);
for (int i = 0; i < n; ++i)
buf2[i] = src[find(atoms, atoms+sizeof(src), buf1[i]) - atoms];
buf2[n] = 0;
sscanf(buf2, "%Lf", &units);
**Примечание:** Весь код внутри тегов `
` и `` сохранен без изменений, как и требовалось в инструкциях. HTML-теги и атрибуты также не переведены. C++ специфические термины оставлены на английском языке.

(где n - количество символов, извлеченных из входных данных и сохраненных в buf1 , а buf2 - другой достаточно большой буфер символов).

Содержание

Возвращаемое значение

Итератор, указывающий сразу после последнего символа, распознанного как допустимая часть строки денежного ввода.

Примечания

Предполагается, что денежные единицы представляют собой наименьшие неделимые единицы валюты: центы в США, иены в Японии. Таким образом, входная последовательность "$1,056.23" в локали США производит число 105623.0 в units или строку "105623" в digits .

Поскольку символ валюты является необязательным, если showbase выключен, но вся многознаковая negative_sign() обязательна, при заданном шаблоне форматирования { sign, value, space, symbol } с выключенным showbase и negative_sign равным "-" , строка "-1.23 €" разбирается как - 123 и оставляет "€" неиспользованным во входном потоке, но если negative_sign равен "()" , строка "(1.23 €)" полностью потребляется.

Манипулятор ввода/вывода std::get_money предоставляет более простой интерфейс для этой функции.

Пример

#include <iostream>
#include <locale>
#include <sstream>
void demo_money_get(std::locale loc, const std::string& input)
{
    std::istringstream str(input);
    str.imbue(loc);
    long double units;
    // Следующее может быть записано проще с помощью std::get_money(units)
    std::ios_base::iostate err = std::ios_base::goodbit;
    std::istreambuf_iterator<char> ret =
        std::use_facet<std::money_get<char>>(loc).get(
            std::istreambuf_iterator<char>(str),
            std::istreambuf_iterator<char>(),
            false, str, err, units);
    str.setstate(err);
    std::istreambuf_iterator<char> last{};
    if (str)
    {
        std::cout << "Успешно разобрано '" << str.str() << "' как "
                  << units / 100 << " единиц\n";
        if (ret != last)
        {
            std::cout << "Оставшееся содержимое: '";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
            std::cout << "'\n";
        }
        else
            std::cout << "Ввод был полностью потреблён\n";
    }
    else
    {
        std::cout << "Разбор не удался. Неразобранная строка: '";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        std::cout << "'\n";
    }
}
int main()
{
    demo_money_get(std::locale("en_US.utf8"), "-$5.12 abc");
    demo_money_get(std::locale("ms_MY.utf8"), "(RM5.12) def");
}

Вывод:

Успешно разобрано '-$5.12 abc' как -5.12 единиц
Оставшееся содержимое: ' abc'
Успешно разобрано '(RM5.12) def' как -5.12 единиц
Оставшееся содержимое: ' def'

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

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