std::num_put

来自cppreference.com
< cpp‎ | locale
在标头 <locale> 定义
template<

    class CharT,
    class OutputIt = std::ostreambuf_iterator<CharT>

> class num_put;

std::num_put 封装格式化数值为字符串的规则。具体而言支持 boollongunsigned longlong longunsigned long long (C++11 起)doublelong doublevoid* 类型和所有能隐式转换到它们的类型(例如 intfloat )。标准格式化输出运算符(如 cout << n;)用输入/输出流的本地环境的 std::num_put 平面生成数字的文本表示。

cpp/locale/locale/facetstd-num put-inheritance.svg

继承图

如果标准库不保证提供 std::num_put 的某个特化(见下文),那么它的成员函数 put()do_put() 不保证会遵守指定的行为。

特化

标准库保证提供以下特化(所有本地环境对象都需要实现这些特化):

在标头 <locale> 定义
std::num_put<char> 创建数的窄字符串表示
std::num_put<wchar_t> 创建数的宽字符串表示

另外,标准库也保证提供满足以下类型要求的所有特化:

成员类型

成员类型 定义
char_type CharT
iter_type OutputIt

成员函数

构造新的 num_put 平面
(公开成员函数)
销毁 num_put 平面
(受保护成员函数)
调用 do_put
(公开成员函数)

受保护成员函数

[虚]
格式化数字并写入到输出流
(虚受保护成员函数)

成员对象

static std::locale::id id
本地环境的 id
(公开成员对象)

示例

#include <iostream>
#include <locale>
#include <string>
#include <iterator>
 
int main()
{
    double n = 1234567.89;
    std::cout.imbue(std::locale("de_DE"));
    std::cout << "直接转换到字符串:\n"
              << std::to_string(n) << '\n'
              << "使用德国本地环境进行输出:\n"
              << std::fixed << n << '\n'
              << "使用美国本地环境进行输出:\n";
 
    // 直接使用平面
    std::cout.imbue(std::locale("en_US.UTF-8"));
    auto& f = std::use_facet<std::num_put<char>>(std::cout.getloc());
    f.put(std::ostreambuf_iterator<char>(std::cout), std::cout, ' ', n);
    std::cout << '\n';
}

输出:

直接转换到字符串:
1234567.890000
使用德国本地环境进行输出:
1.234.567,890000
使用美国本地环境进行输出:
1,234,567.890000

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 427 C++98 num_put 可以接受任何满足实例化所有
iostream 组件所需的对字符类型的要求的 CharT
只保证接受 char
wchar_t,其他类型由实现定义

参阅

定义数值标点规则
(类模板)
从输入字符序列中解析数字值
(类模板)
(C++11)
转换整数或浮点值为 string
(函数)
转换整数或浮点值为 wstring
(函数)