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() требуется, учитывая шаблон форматирования {sign, value, space, symbol} с выключенным showbase и отрицательным знаком "-", строка "-1.23 €" анализируется как -123 и оставляет "€" необработанным в потоке ввода, но если отрицательный знак "()", строка "(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/w/cpp/locale/money_get/get