是否存在{fmt} API类似std::to_chars且可返回格式化数字各部分string_view?
{fmt} 拆分数值格式化结果的对应API
存在完全匹配你需求的能力,{fmt} 提供了多层接口实现该需求,且全部为公开API,无兼容性风险:
- 兼容标准的基础接口:
fmt::to_chars
该接口是std::to_chars的兼容实现,用法和标准库完全一致,输出结果为连续的字符区间,且支持比标准库更丰富的格式化配置(如自定义精度、进制、指数表示规则等),性能和准确性完全对齐 {fmt} 核心格式化逻辑,你可以直接基于输出的字符区间做拆分,也可以配合下文中的结构化接口直接获取各部分视图。 - 结构化拆分接口,无需二次解析
针对整数和浮点数场景,{fmt} 分别提供了无需二次解析即可获取各部分视图的能力:- 整数场景
使用fmt::format_int类,可直接获取符号标识和整数部分的字符串视图:
// 示例:格式化负整数 fmt::format_int fint(-12345); bool has_minus_sign = fint.is_negative(); // 符号标识 fmt::string_view int_part = fint.str(); // 整数部分字符串视图,不包含符号- 浮点数场景
你可以通过自定义输出迭代器在格式化过程中直接捕获各部分边界,{fmt} 的浮点数格式化逻辑按「符号→整数部分→小数点→小数部分→指数符号→指数值」的固定顺序输出内容,你只需要在自定义迭代器中标记各部分的起止位置,即可直接得到对应string_view,无额外解析开销。
从 {fmt} 10.0 版本开始,还新增了fmt::split_float公开接口,调用后会直接返回包含符号、整数部分、小数部分、指数符号、指数值的结构化结果,无需自己实现迭代器逻辑。
- 整数场景
以上所有接口都不会产生额外的内存拷贝,所有返回的视图均指向格式化过程中的原始缓冲区,完全满足你自定义后处理(如插入千位分隔符、调整本地化格式、自定义指数标识等)的需求,不需要自行实现数值转换逻辑,也避免了格式化后二次解析的性能损耗。
内容的提问来源于stack exchange,提问作者Mike Kaganski
相关产品推荐
相关产品推荐

