命名空间
变体
操作

std::to_chars

来自 cppreference.com
< cpp‎ | utility
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
to_chars
(C++17)
(C++17)

 
在头文件 <charconv> 中定义
std::to_chars_result

    to_chars( char* first, char* last,

              /* 整型 */ value, int base = 10 );
(1) (自 C++17 起)
(自 C++23 起为 constexpr)
std::to_chars_result
    to_chars( char*, char*, bool, int = 10 ) = delete;
(2) (自 C++17 起)
std::to_chars_result
    to_chars( char* first, char* last, /* 浮点类型 */ value );
(3) (自 C++17 起)
std::to_chars_result

    to_chars( char* first, char* last, /* 浮点类型 */ value,

              std::chars_format fmt );
(4) (自 C++17 起)
std::to_chars_result

    to_chars( char* first, char* last, /* 浮点类型 */ value,

              std::chars_format fmt, int precision );
(5) (自 C++17 起)

value 转换为一个字符字符串,通过依次填充范围 [firstlast),其中 [firstlast) 必须是 有效范围

1) 整数格式化程序:value 被转换为给定 base 中的数字字符串(不含冗余的前导零)。范围 10..35(包含)中的数字用小写字母 a..z 表示。如果 value 小于零,则表示法以减号开头。库为所有 cv-未限定(自 C++23 起) 有符号和无符号整数类型以及 char 类型提供重载,作为参数 value 的类型。
2) bool 的重载已删除。std::to_chars 拒绝类型为 bool 的参数,因为结果将是 "0"/"1",而不是 "false"/"true",如果允许的话。
3) value 被转换为字符串,如同在默认的 ("C") 本地化中使用 std::printf 一样。转换说明符为 fe(在出现平局的情况下选择 f),根据最短表示的要求选择:字符串表示由最少数量的字符组成,这样在小数点之前(如果存在)至少有一个数字,并且使用相应的 std::from_chars 函数解析表示能够完全恢复 value。如果存在多个这样的表示,则选择与 value 差异最小的一个,使用根据 std::round_to_nearest 的舍入解决任何剩余的平局。库为所有 cv-未限定的 标准(直到 C++23) 浮点类型提供重载,作为参数 value 的类型。
4)(3) 相同,但作为 if printf 指定的转换是 f,如果 fmtstd::chars_format::fixede,如果 fmtstd::chars_format::scientifica(但结果中不包含前导 "0x"),如果 fmtstd::chars_format::hex,以及 g,如果 fmtchars_format::general。库为所有 cv-未限定的 标准(直到 C++23) 浮点类型提供重载,作为参数 value 的类型。
5)(4) 相同,除了精度由参数 precision 指定,而不是由最短表示要求指定。库为所有 cv-未限定的 标准(直到 C++23) 浮点类型提供重载,作为参数 value 的类型。

内容

[编辑] 参数

first, last - 要写入的字符范围
value - 要转换为其字符串表示的值
base - 要使用的整数基数:2 到 36 之间的值(包含)。
fmt - 要使用的浮点格式,类型为 std::chars_format 的位掩码
precision - 要使用的浮点精度

[编辑] 返回值

成功时,返回类型为 std::to_chars_result 的值,使得 ec 等于值初始化的 std::errc,而 ptr 是写入的字符的最后一个之后的指针。请注意,字符串没有以 NUL 结尾。

发生错误时,返回类型为 std::to_chars_result 的值,在 ec 中包含 std::errc::value_too_large,在 ptr 中包含值 last 的副本,并将范围 [firstlast) 的内容置于未指定状态。

[编辑] 异常

不抛出任何异常。

[编辑] 备注

与 C++ 和 C 库中的其他格式化函数不同,std::to_chars 与区域设置无关,不进行分配,也不抛出异常。仅提供其他库(如 std::sprintf)使用的格式化策略的一小部分。这样做的目的是允许在常见的吞吐量高的上下文中(例如基于文本的交换(JSONXML))使用尽可能快的实现。

仅当两个函数都来自同一实现时,才能保证 std::from_chars 可以完全恢复由 std::to_chars 格式化的每个浮点数的值。

如果要将 bool 值格式化为 "0"/"1",则需要显式地将它转换为另一个整数类型。

功能测试 标准 特性
__cpp_lib_to_chars 201611L (C++17) 基本字符串转换(std::to_charsstd::from_chars
202306L (C++26) 测试 <charconv> 函数的成功或失败
__cpp_lib_constexpr_charconv 202207L (C++23) std::to_charsstd::from_chars 的重载 (1) 中为整数类型添加 constexpr 修饰符

[编辑] 示例

#include <charconv>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <system_error>
 
void show_to_chars(auto... format_args)
{
    const size_t buf_size = 10;
    char buf[buf_size]{};
    std::to_chars_result result = std::to_chars(buf, buf + buf_size, format_args...);
 
    if (result.ec != std::errc())
        std::cout << std::make_error_code(result.ec).message() << '\n';
    else
    {
        std::string_view str(buf, result.ptr - buf);
        std::cout << std::quoted(str) << '\n';
    }
}
 
int main()
{
    show_to_chars(42);
    show_to_chars(+3.14159F);
    show_to_chars(-3.14159, std::chars_format::fixed);
    show_to_chars(-3.14159, std::chars_format::scientific, 3);
    show_to_chars(3.1415926535, std::chars_format::fixed, 10);
}

可能的输出

"42"
"3.14159"
"-3.14159"
"-3.142e+00"
Value too large for defined data type

[编辑] 缺陷报告

以下行为变更的缺陷报告已追溯应用于之前发布的 C++ 标准。

DR 应用于 发布的行为 正确行为
LWG 2955 C++17 此函数在 <utility> 中,并使用 std::error_code 移动到 <charconv> 并使用 std::errc
LWG 3266 C++17 bool 参数被接受并提升为 int 被已删除的重载拒绝
LWG 3373 C++17 std::to_chars_result 可能具有其他成员 不允许其他成员

[编辑] 另请参阅

std::to_chars 的返回类型
(类) [编辑]
将字符序列转换为整数或浮点数
(函数) [编辑]
(C++11)
将整数或浮点数转换为 string
(函数) [编辑]
将格式化的输出打印到 stdout、文件流或缓冲区
(函数) [编辑]
插入格式化的数据
(std::basic_ostream<CharT,Traits> 的公有成员函数) [编辑]