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,则在 err 中设置 failbit 和 eofbit。如果由于其他原因解析失败,则在 err 中设置 failbit
。无论哪种情况,都不会修改输出参数(units 或 digits)。
如果解析成功,则不更改 err,并将结果存储在 units 或 digits 中。
此函数使用的格式化 模式 始终是 mp.neg_format()。
如果 mp.grouping() 不允许使用千位分隔符,则遇到的第一个分隔符将被视为解析错误,否则它们将被视为可选。
如果 money_base::space 或 money_base::none 是 模式 中的最后一个元素,则解析器不会尝试在解析货币值的其余部分后使用任何空格。否则,将使用一个或多个空格字符,其中 money_base::space 出现在其中。
如果 str.flags() 中设置了 showbase
标志,则需要货币符号或货币字符串,如果未设置,则货币符号是可选的。
如果 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" 在 units 中产生数字 105623.0,或在 digits 中产生字符串 "105623"。
由于货币符号是可选的(如果 showbase
关闭),但整个多字符 negative_sign()
是必需的,因此给定格式化模式 {sign, value, space, symbol}(showbase
关闭,negative_sign
为 "-"),字符串 "-1.23 €" 被解析为 -123,并在输入流上留下未使用的“€”,但如果 negative_sign
为 "()",则字符串 "(1.23 €)" 将被完全消耗。
I/O 操作符 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) |
解析货币值。 (函数模板) |