2.2字符串格式化(From C++20)

2.2字符串格式化(From C++20)


C++20引入了 std::format(),其定义在 <format>中,参考链接: cppreference_format

format()的第一个参数是待格式化的字符串,后续参数是用于填充待格式化字符串中占位符的值。到目前为止,使用 format()时的占位符一般都是一对花括号{}。在这些花括号内可以是格式为[index][:specifier]的字符串。

  • 可以省略所有占位符中的 index,也可以为所有占位符指定从零开始的索引,以指明应用于此占位符的第二个和后续参数。如果省略 index,则 format()的第二个和后续参数传递的值将按给定顺序用于所有占位符。
  • specifier 是一种格式说明符,用于更改值在输出中格式化的方式,将在下一节详细说明。
  • 如果需要输出{}字符,则需要将其转义为{{}}

index的使用如下:

auto s1 {format("Read {} bytes from {}", n, "file1.txt")};
auto s2 {format("Read {0} bytes from {1}", n, "file2.txt")};
auto s2 {format("Read {1} bytes from {0}", "file2.txt", n)};

不允许混合使用手动和自动索引。

1.格式说明符

格式说明符用于控制值在输出中的格式,前缀为冒号。格式说明符的一般形式如下所示:

[[fill]align][sign][#][0][width][.precision][type]

方括号里的所有说明符都是可选的。

1.1width

width指定待格式化的值所占字段的最小宽度,例如5。width 也可以是另一组花括号,称为动态宽度。如果在花括号中指定了索引,例如{3},则动态宽度的 width 取自给定的索引对应的 format()的实参。如果未指定索引,例如{},则width取自 format()的实参列表中的下一个参数。

int n{42};
cout << format("|{:5}|\n",n);
cout << format("|{:{}}|\n",n,7)<<endl;

// OUTPUT
|   42|
|     42|

1.2[fill]align

[fil]align也是可选的,说明使用哪个字符作为填充字符,然后是值在其字段中的对齐方式∶

  • <表示左对齐(非整数和非浮点数的默认对齐方式))。
  • >表示右对齐(整数和浮点数的默认对齐方式)。
  • ^表示居中对齐。

fill 字符会被插入输出中,以确保输出中的字段达到说明符的[width]指定的最小宽度。如果未指
[width],则[fil]align 无效。

int n{42};
cout << format("|{:7}|\n",n);
cout << format("|{:<7}|\n",n);
cout << format("|{:_>7}|\n",n);
cout << format("|{:_^7}|\n",n);

// OUTPUT
|     42|
|42     |
|_____42|
|__42___|

1.3sign

sign可以是下列三项之一:

  • -表示只显示负数的符号(默认方式)。
  • +表示显示正数和负数的符号。
  • space表示对于负数使用负号,对于正数使用空格。
int n{42};
cout << format("|{:7}|\n",n);
cout << format("|{:<+7}|\n",n);
cout << format("|{: >7}|\n",n);
cout << format("|{: ^7}|\n",-n);

// OUTPUT
|     42|
|+42    |
|     42|
|  -42  |

1.4#

#启用所谓的备用格式(alternate formatting)规则。如果为整型启用,并且还指定了十六进制、二进制或八进制数字格式,则备用格式会在格式化数字前面插入0x0X0b0B0。如果为浮点类型启用,则备用格式将始终输出十进制分隔符,即使后面没有数字。

1.5type

type指定了给定值要被格式化的类型:

  • 整形:b(二进制),B(二进制,当指定#时,使用0B 而不是 0b),d(十进制),o(八进制),x(小写字母a,b,c,d,e 的十六进制),X(大写字母A,B,C,D,E 的十六进制,当指定#时,使用0X而不是0x)。如果 type未指定,整型默认使用d
  • 浮点型:待补充
  • 布尔型:s(以文本形式输出true或false),b,B,c,d,o,x,X(以整型输出1或0)
  • 字符型:c(输出字符副本),b,B,d,o,x,X(整数表示)
  • 字符串∶s(输出字符串副本)
  • 指针:p(0x为前缀的十六进制表示法)

1.6precision

precision 只能用于浮点和字符串类型。它的格式为一个点后跟浮点类型要输出的小数位数,或字符串要输出的字符数。就像width一样,这也可以是另一组花括号,在这种情况下,它被称为动态精度。precision 取自 format()的实参列表中的下一个实参或具有给定索引的实参。

1.70

表示,对于数值,将0插入格式化结果中,以达到[width]指定的最小宽度(请参阅前面的内容)。这些0插入在数值的前面,但在符号以及任何0x、0X、0b 或0B前缀之后。如果指定了对齐,则将忽略本选项。

2.格式说明符错误

如果格式说明符错误,将抛出std::format_error异常。

3.支持自定义类型

std::fommatter 类模板的特化版本,该模板包含两个方法模板:parse()format()

待补充

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值