namespace std { template <class charT, class InputIterator = istreambuf_iterator<charT>> class money_get : public locale::facet { public: using char_type = charT; using iter_type = InputIterator; using string_type = basic_string<charT>; explicit money_get(size_t refs = 0); iter_type get(iter_type s, iter_type end, bool intl, ios_base& f, ios_base::iostate& err, long double& units) const; iter_type get(iter_type s, iter_type end, bool intl, ios_base& f, ios_base::iostate& err, string_type& digits) const; static locale::id id; protected: ~money_get(); virtual iter_type do_get(iter_type, iter_type, bool, ios_base&, ios_base::iostate& err, long double& units) const; virtual iter_type do_get(iter_type, iter_type, bool, ios_base&, ios_base::iostate& err, string_type& digits) const; }; }
iter_type get(iter_type s, iter_type end, bool intl,
ios_base& f, ios_base::iostate& err,
long double& quant) const;
iter_type get(s, iter_type end, bool intl, ios_base&f,
ios_base::iostate& err, string_type& quant) const;
iter_type do_get(iter_type s, iter_type end, bool intl,
ios_base& str, ios_base::iostate& err,
long double& units) const;
iter_type do_get(iter_type s, iter_type end, bool intl,
ios_base& str, ios_base::iostate& err,
string_type& digits) const;
Effects: Считывает символы из, s чтобы проанализировать и построить денежное значение в соответствии с форматом, указаннымmoneypunct<charT, Intl> ссылкой на фасет, mp и отображением символов, указаннымctype<charT> ссылкой на фасет, ct полученной из языкового стандарта, возвращенного str.getloc(), и str.flags(). Если действительная последовательность распознана, не изменяется err; в противном случае устанавливается err значение (err|str.failbit)или, (err|str.failbit|str.eofbit) если больше нет доступных символов, и не изменяется units или digits. Использует шаблон, возвращенный mp.neg_format() для анализа всех значений. Результат возвращается как целое значение, хранящееся в, units или как последовательность цифр, которой может предшествовать знак минус (как результат, ct.widen(c) где c есть '-' или в диапазоне от '0' до '9', включительно), сохраненный в digits. [ Example: Последовательность $1,056.23 в общей местности Соединенных Штатов дало бы, по units, 105623, или, digits, "105623". ] Если указывает, что разделители тысяч не разрешены, любые такие символы не читаются, и синтаксический анализ завершается в точке, где они появляются впервые. В противном случае разделители тысяч не являются обязательными; если они присутствуют, они проверяются на правильность размещения только после того, как будут прочитаны все компоненты формата. — end example mp.grouping()
Если money_base::space или money_base::none отображается как последний элемент в шаблоне формата, пробелы не используются. В противном случае, где money_base::space встречается в любом из начальных элементов шаблона формата, требуется по крайней мере один символ пробела. Если money_base::none присутствует в любом из начальных элементов шаблона формата, пробелы разрешены, но не обязательны. Если задано значение (str.flags() & str.showbase) false, символ валюты является необязательным и используется только в том случае, если для завершения формата необходимы другие символы; в противном случае требуется символ валюты.
Если первый символ (если есть) в строке, pos возвращаемой mp.positive_sign() илиneg возвращенной строкой , mp.negative_sign() распознается в позиции, указанной sign в шаблоне формата, он используется, и любые оставшиеся символы в строке требуются после всех других компонентов формата. [ Example: Если showbase выключен, то для neg значения "()" и символа валютной "L", в потребляется; но если есть , то in не потребляется. ] Если или пусто, компонент знака является необязательным, и если знак не обнаружен, результат получает знак, соответствующий источнику пустой строки. В противном случае символ в указанной позиции должен соответствовать первому символу или , и результат получает соответствующий знак. Если первый символ равен первому символу или обе строки пусты, результат получает положительный знак. "(100 L)" "L" neg "-" "L" "-100 L" — end example posnegposnegposneg
Цифры в числовом денежном компоненте извлекаются и помещаются в digitsили в символьный буфер buf1 для преобразования для получения значения unitsв том порядке, в котором они появляются, с предшествующим знаком минус тогда и только тогда, когда результат отрицательный. Значение units создается, как если бы248
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 - символьный буфер, а значения src и atoms определяются как если бы
static const char src[] = "0123456789-"; charT atoms[sizeof(src)]; ct.widen(src, src + sizeof(src) - 1, atoms);
Returns: Итератор, указывающий сразу за последним символом, признанным частью допустимой денежной величины.
Семантика здесь отличается от ct.narrow.