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)规则。如果为整型启用,并且还指定了十六进制、二进制或八进制数字格式,则备用格式会在格式化数字前面插入0x
、0X
、0b
、0B
或0
。如果为浮点类型启用,则备用格式将始终输出十进制分隔符,即使后面没有数字。
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()
。
待补充