std::num_get
来自cppreference.com
| 在标头 <locale> 定义
|
||
| |
||
类 std::num_get 封装分析数值的字符串表示的规则。特别是支持类型 bool、unsigned short、unsigned int、long、unsigned long、long long、unsigned long long(C++11 起)、float、double、long double 及 void*。标准格式化输入运算符(如 cin >> n;)用输入/输出流的本地环境的 std::num_get 刻面解析数字的文本表示。
继承图
如果标准库不保证提供 std::num_get 的某个特化(见下文),那么它的成员函数 get() 和 do_get() 不保证会遵守指定的行为。
特化
标准库保证提供以下特化(所有本地环境对象都需要实现这些特化):
在标头
<locale> 定义 | |
std::num_get<char>
|
创建数字的窄字符串分析 |
std::num_get<wchar_t>
|
创建数字的宽字符串分析 |
另外,标准库也保证提供满足以下类型要求的所有特化:
CharT是以下类型之一:charwchar_t- 由实现定义的其他任何字符容器类型,该类型需要满足实例化所有 iostream 组件所需的对字符的要求
InputIt需要满足老式输入迭代器 (LegacyInputIterator) 的要求
嵌套类型
| 类型 | 定义 |
char_type
|
CharT
|
iter_type
|
InputIt
|
数据成员
| 成员 | 描述 |
std::locale::id id [静态]
|
刻面标识 |
成员函数
构造新的 num_get 刻面 (公开成员函数) | |
调用 do_get (公开成员函数) |
受保护成员函数
析构 num_get 刻面 (受保护成员函数) | |
[虚] |
从输入流分析数字 (虚受保护成员函数) |
示例
运行此代码
#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
#include <string>
int main()
{
std::string de_double = "1.234.567,89";
std::string us_double = "1,234,567.89";
// 使用流进行分析
std::istringstream de_in(de_double);
de_in.imbue(std::locale("de_DE.UTF-8"));
double f1;
de_in >> f1;
std::istringstream us_in(de_double);
us_in.imbue(std::locale("en_US.UTF-8"));
double f2;
us_in >> f2;
std::cout << "用 de_DE 和 en_US 本地环境将" << de_double
<< " 解析为 double 分别得到 " << std::fixed
<< f1 << " 和 " << f2 << '\n';
// 直接使用刻面
std::istringstream s3(us_double);
s3.imbue(std::locale("en_US.UTF-8"));
auto& f = std::use_facet<std::num_get<char>>(s3.getloc());
std::istreambuf_iterator<char> beg(s3), end;
double f3;
std::ios::iostate err;
f.get(beg, end, s3, err, f3);
std::cout << "使用原始 en_US 刻面将" << us_double
<< " 解析为 double 得到 " << f3 << '\n';
}
输出:
用 de_DE 和 en_US 本地环境将 1.234.567,89 解析为 double 分别得到 1234567.890000 和 1.234000
使用原始 en_US 平面将 1,234,567.89 解析为 double 得到 1234567.890000
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 427 | C++98 | num_put 保证接受任何满足实例化所有iostream 组件所需的对字符类型的要求的 CharT
|
只保证接受 char、wchar_t和其他由实现定义的字符类型 |
| LWG 2392 | C++98 | num_put 能够保证接受的 CharT 只有字符类型
|
可以保证接受由实现定义的字符容器类型 |
参阅
| 定义数值标点规则 (类模板) | |
| 格式化数值为字符序列以输出 (类模板) | |
| 提取带格式数据 ( std::basic_istream<CharT,Traits> 的公开成员函数)
|