std::money_get<CharT,InputIt>::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 или строку.
do_get наиболее производного класса.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);
(где n — число символов, извлечённых из входных данных и сохранённых в buf1, а buf2 — другой достаточно большой символьный буфер).
Возвращаемое значение
Итератор, указывающий непосредственно после последнего символа входной денежной строки, распознанного как допустимая её часть.
Примечания
Предполагается, что денежные единицы являются наименьшими недробными единицами валюты: центами в США, иенами в Японии. Поэтому входная последовательность "$1,056.23" в локали США даёт число 105623.0 в units или строку "105623" в digits.
Поскольку символ валюты необязателен, если showbase выключен, но вся многосимвольная negative_sign() обязательна, строка "-1.23 €" при шаблоне форматирования {sign, value, space, symbol}, выключенном showbase и negative_sign, равном "-", разбирается как -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;
// The following can be written simpler with 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 << "Successfully parsed '" << str.str() << "' as "
<< units / 100 << " units\n";
if (ret != last)
{
std::cout << "Remaining content: '";
std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
std::cout << "'\n";
}
else
std::cout << "The input was fully consumed\n";
}
else
{
std::cout << "Parse failed. Unparsed string: '";
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");
}
Вывод:
Successfully parsed '-$5.12 abc' as -5.12 units Remaining content: ' abc' Successfully parsed '(RM5.12) def' as -5.12 units Remaining content: ' def'
См. также
определяет параметры форматирования денежных значений, используемые в std::money_get и std::money_put (шаблон класса) |
|
| разбирает и формирует денежное значение из входной последовательности символов (шаблон класса) |
|
|
(C++11) | разбирает денежное значение (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/money_get/get