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,
|
(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,
|
(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
наиболее производного класса.
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)
|
анализирует денежную величину
(шаблон функции) |