fmtlib/fmt 格式化字符串语法详解

fmtlib/fmt 格式化字符串语法详解

【免费下载链接】fmt A modern formatting library 【免费下载链接】fmt 项目地址: https://gitcode.com/GitHub_Trending/fm/fmt

fmtlib/fmt 是一个现代 C++ 格式化库,提供了高效、安全的格式化功能。本文将深入解析其格式化字符串语法,帮助开发者掌握其核心用法。

基础语法结构

fmtlib/fmt 的格式化字符串使用大括号 {} 作为占位符,包含两个主要部分:

  1. 参数标识符 (arg_id):指定要格式化的参数
  2. 格式规范 (format_spec):定义如何格式化参数

基本语法如下:

replacement_field ::= "{" [arg_id] [":" (format_spec | chrono_format_spec)] "}"

参数标识符规则

参数标识符可以是:

  • 整数:0, 1, 2...
  • 标识符:字母或下划线开头的字符串

当参数标识符按顺序从0开始连续排列时,可以全部省略:

"First, thou shalt count to {0}"  // 显式引用第一个参数
"Bring me a {}"                   // 隐式引用第一个参数
"From {} to {}"                  // 等同于 "From {0} to {1}"

格式规范详解

格式规范定义了值的显示方式,包括对齐、填充、精度等。基本结构为:

format_spec ::= [[fill]align][sign]["#"]["0"][width]["." precision]["L"][type]

对齐与填充

选项说明
'<'左对齐(大多数类型的默认值)
'>'右对齐(数字的默认值)
'^'居中对齐

填充字符可以是除 {} 外的任何 Unicode 字符。例如:

fmt::format("{:*^10}", "hello");  // 输出 "**hello***"

符号控制

选项说明
'+'正负数都显示符号
'-'仅负数显示符号(默认)
空格正数前加空格,负数前加负号

特殊格式选项

  • '#':使用替代形式(如十六进制添加 0x 前缀)
  • '0':数字前补零
  • 'L':使用本地化数字分隔符

类型说明符

不同类型有不同的格式选项:

整数类型
类型说明
'b'二进制(如 0b1010
'B'二进制(大写前缀 0B
'd'十进制(默认)
'o'八进制
'x'小写十六进制
'X'大写十六进制
浮点数类型
类型说明
'f'固定小数格式
'F'固定小数格式(大写 INF/NAN)
'e'科学计数法(小写 e)
'E'科学计数法(大写 E)
'g'自动选择 fe
'G'自动选择 FE
字符串类型
类型说明
's'字符串(默认)
'?'调试格式(转义特殊字符)

时间日期格式化

fmtlib/fmt 支持对 std::chrono 类型和 std::tm 进行格式化,语法类似 strftime:

chrono_format_spec ::= [[fill]align][width]["." precision][chrono_specs]

常用时间格式说明符:

说明符说明
%Y四位年份
%m两位月份
%d两位日期
%H24小时制小时
%M分钟
%S
%A完整星期名
%B完整月份名

示例:

auto now = std::chrono::system_clock::now();
fmt::print("{:%Y-%m-%d %H:%M:%S}", now);  // 输出 "2023-11-15 14:30:00"

实际应用技巧

  1. 动态格式控制:可以在格式规范中嵌套参数

    fmt::print("{:.{}f}", 3.14159, 2);  // 输出 "3.14"
    
  2. 本地化数字显示:使用 'L' 选项

    fmt::print("{:L}", 1000);  // 可能输出 "1,000" 或 "1.000"
    
  3. 二进制输出

    fmt::print("{:#b}", 10);  // 输出 "0b1010"
    
  4. 对齐填充组合

    fmt::print("{:*>10}", "hi");  // 输出 "********hi"
    

掌握这些格式化技巧可以显著提升 C++ 程序的输出质量和开发效率。fmtlib/fmt 的格式化语法既强大又灵活,能够满足各种复杂的格式化需求。

【免费下载链接】fmt A modern formatting library 【免费下载链接】fmt 项目地址: https://gitcode.com/GitHub_Trending/fm/fmt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值