std::money_get
来自cppreference.com
在标头 <locale> 定义
|
||
template< class CharT, |
||
类模板 std::money_get
封装从字符流解析货币值的规则。标准输入/输出操纵符 std::get_money 使用输入/输出流的本地环境的 std::money_get
平面。
继承图
如果标准库不保证提供 std::money_get
的某个特化(见下文),那么它的成员函数 get() 和 do_get() 不保证会遵守指定的行为。
特化
标准库保证提供以下特化(所有本地环境对象都需要实现这些特化):
在标头
<locale> 定义 | |
std::money_get<char> | 分析货币值的窄字符串表示 |
std::money_get<wchar_t> | 分析货币值的宽字符串表示 |
另外,标准库也保证提供满足以下类型要求的所有特化:
-
CharT
是以下类型之一:- char
- wchar_t
- 由实现定义的其他任何字符类型,该类型需要满足实例化所有 iostream 组件所需的对字符类型的要求
-
InputIt
需要满足老式输入迭代器 (LegacyInputIterator) 的要求
成员类型
成员类型 | 定义 |
char_type
|
CharT
|
string_type
|
std::basic_string<CharT> |
iter_type
|
InputIt
|
成员函数
构造新的 money_get 平面 (公开成员函数) | |
销毁 money_get 平面 (受保护成员函数) | |
调用 do_get (公开成员函数) |
受保护成员函数
[虚] |
分析来自输入流的货币值 (虚受保护成员函数) |
成员对象
static std::locale::id id |
本地环境的 id (公开成员对象) |
示例
运行此代码
#include <iostream> #include <sstream> #include <locale> #include <iomanip> #include <iterator> int main() { std::string str = "$1.11 $2.22 $3.33"; std::cout << std::fixed << std::setprecision(2); std::cout << '"' << str << "\" 以输入/输出操纵符解析:"; std::istringstream s1(str); s1.imbue(std::locale("en_US.UTF-8")); long double val; while (s1 >> std::get_money(val)) std::cout << val / 100 << ' '; std::cout << '\n'; str = "USD 1,234.56"; std::cout << '"' << str << "\" 通过平面直接解析:"; std::istringstream s2(str); s2.imbue(std::locale("en_US.UTF-8")); auto& f = std::use_facet<std::money_get<char>>(s2.getloc()); std::ios_base::iostate err; std::istreambuf_iterator<char> beg(s2), end; f.get(beg, end, true, s2, err, val); std::cout << val / 100 << '\n'; }
输出:
"$1.11 $2.22 $3.33" 以输入/输出操纵符解析:1.11 2.22 3.33 "USD 1,234.56" 通过平面直接解析:1234.56
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 427 | C++98 | money_get 可以接受任何满足实例化所有iostream 组件所需的对字符类型的要求的 CharT
|
只保证接受 char 和 wchar_t,其他类型由实现定义 |
参阅
定义 std::money_get 与 std::money_put 所用的货币格式解析器的参数 (类模板) | |
格式化货币值为字符序列以输出 (类模板) | |
(C++11) |
剖析货币值 (函数模板) |