# std::num_get

< cpp‎ | locale

定义于头文件 `<locale>` |  |
template< class CharT, class InputIt = std::istreambuf_iterator<CharT> > class num_get; |  |

类 `std::num_get` 封装分析数值的字符串表示的规则。特别是支持类型 bool 、 unsigned short 、 unsigned int 、 long 、 unsigned long 、 long long 、 unsigned long long 、 float 、 double 、 long double 及 void* 。标准格式化输入运算符（如 cin >> n; ）用 I/O 流的 locale 的 `std::num_get` 平面分析数字的文本表示。

继承图

### 类型要求

- `InputIt` 必须满足老式输入迭代器 (LegacyInputIterator) 的要求。

### 特化

标准库提供二个独立（不依赖本地环境）的全特化和二个部分特化：

定义于头文件 `<locale>`
std::num_get<char> | 创建数字的窄字符串分析
std::num_get<wchar_t> | 创建数字的宽字符串分析
std::num_get<char, InputIt> | 创建数字的使用定制输入迭代器的窄字符串分析
std::num_get<wchar_t, InputIt> | 创建数字的使用定制输入迭代器的宽字符串分析

另外， C++ 程序中构造的每个 locale 对象都实装这些特化的其自身（本地环境限定）版本。

### 成员类型

成员类型 | 定义
`char_type` | `CharT`
`iter_type` | `InputIt`

### 成员函数

(构造函数) | 构造新的 num_get 平面 (公开成员函数)
(析构函数) | 析构 num_get 平面 (受保护成员函数)
get | 调用 `do_get` (公开成员函数)

### 成员对象

static std::locale::id id | locale 的 id (公开成员对象)

### 受保护成员函数

do_get [虚] | 从输入流分析数字 (虚受保护成员函数)

### 示例

    #include <iostream>
    #include <locale>
    #include <string>
    #include <sstream>
    #include <iterator>

    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"));
        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 << "Parsing " << de_double << " as double gives " << std::fixed
                  << f1 << " in de_DE locale and " << f2 << " in en_US\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 << "parsing " << us_double
                  << " as double using raw en_US facet gives " << f3 << '\n';
    }

输出：

    Parsing 1.234.567,89 as double gives 1234567.890000 in de_DE locale and 1.234000 in en_US
    parsing 1,234,567.89 as double using raw en_US facet gives 1234567.890000

### 参阅

numpunct | 定义数值标点规则 (类模板)
num_put | 格式化数值为字符序列以输出 (类模板)
operator>> | 提取带格式数据 (`std::basic_istream<CharT,Traits>` 的公开成员函数)