C++20引入了<format>库,它提供了类似于Python的格式化字符串的功能。
你可以使用std::format函数来格式化字符串。
format 格式控制标记 [[fill]align][sign][#][0][wigth][precision][type]
下面依次讲解format的格式控制标记的基本用法:
1.[[fill]align]
这个格式说明符是控制填充和对齐的
fill是指定占位符的填充字符,通常是一个字符填充了空间的小块
如果没有表示则就默认是空格进行填充
align是在其字段中的对齐方式:
有三种对齐的方式:
1. < 表示左对齐(非整数和非浮点数的默认对齐方式)
2. > 表示右对齐(整数和浮点数的默认对齐方式)
3. = 表示居中对齐
例子:
#include<iostream>
#include<format>
int main()
{
int i{ 44 };
double j{ 323.123 };
std::cout << std::format("{0:*^15} {1:*^15}", i, j)<<std::endl;
return 0;
}
//运行出来的结果是
//******44******* ****323.123****
注:使用这个格式说明符要填充一个字符例如“*”不是空格填充,那填充与对齐都要一起说明
2.[sign]
这个格式说明符是控制符号的
简单的来说就是+号和-号
1. + 表示显示整数和负数的符号 (会给所有非负数加上+号)
2. - 表示只显示负数的符号 (默认的方式)
通过下面这个例子可以很好的理解:
#include<iostream>
#include<format>
int main()
{
int i{ 0 };
int j{ 1 };
int h{-1 };
std::cout << std::format("{:+}, {:-}", i,i) << std::endl;
std::cout << std::format("{:+}, {:-}", j,j) << std::endl;
std::cout << std::format("{:+}, {:-}", h,h) << std::endl;
return 0;
}
//输出的结果是
//+0, 0
//+1, 1
//-1, -1
3.[#][0]
这两个格式说明符可以用来用于控制数字的格式。
#:
对于整数类型,#用作前缀指示符。
在十六进制数前面添加0x或0X前缀,在二进制数前面添加0b或0B前缀(尽管标准C++库并不直接支持二进制格式说明符)。
#include<iostream>
#include<format>
int main()
{
std::cout << std::format("十六进制输出 = {:#x}", 222) << std::endl;
std::cout << std::format("十进制输出= {:#d}", 222) << std::endl;
std::cout << std::format("八进制输出 = {:#o}", 222) << std::endl;
std::cout << std::format("二进制输出 = {:#b}", 222) << std::endl;
std::cout << std::format("十六进制输出 = {:x}", 222) << std::endl;
std::cout << std::format("十进制输出= {:d}", 222) << std::endl;
std::cout << std::format("八进制输出 = {:o}", 222) << std::endl;
std::cout << std::format("二进制输出 = {:b}", 222) << std::endl;
return 0;
}
//输出结果是:
//十六进制输出 = 0xde
//十进制输出= 222
//八进制输出 = 0336
//二进制输出 = 0b11011110
//十六进制输出 = de
//十进制输出= 222
//八进制输出 = 336
//二进制输出 = 11011110
这段代码可以看出用#与不用#的区别
0:
用作填充字符。当数据的宽度小于格式说明符中指定的宽度时,0用于填充剩余的空间。这通常与宽度说明符一起使用,以确保数值达到特定的宽度,并且在左侧用零填充。
#include<iostream>
#include<format>
int main()
{
int i{ 44 };
std::cout << std::format("{:#08x}", i) << std::endl;
return 0;
}
//输出结果:
//0x00002c
4.[wight]
这个格式标识符可以用于指定输出字段的最小宽度。
如果实际值小于这个宽度,输出将被填充以达到指定的宽度。
填充可以是空格(默认)或者通过指定填充。
#include<iostream>
#include<format>
int main()
{
int i{ 44 };
std::cout << std::format("{:1}", i) << std::endl;
std::cout << std::format("{:10}", i) << std::endl;
std::cout << "为了让看起来更加清晰明了用!来填充" << std::endl;
std::cout << std::format("{:*^1}", i) << std::endl;
std::cout << std::format("{:*^10}", i) << std::endl;
return 0;
}
//输出的结果是:
//44
// 44
//为了让看起来更加清晰明了用!来填充
//44
//****44****
5.[precision]
用于指定浮点数的精度,即小数点后显示的数字位数
例子:
在这个例子里的f与e是输出的数据类型type,在下面会有讲到
#include<iostream>
#include<format>
int main()
{
double i{ 44.8190 };
std::cout << std::format("{:.1f}", i) << std::endl;
std::cout << std::format("{:.1e}", i) << std::endl;
return 0;
}
输出结果是:
//44.8
//4.5e+01
6.[type]
这个格式控制符是用于控制值的输出格式
比如以二进制、八进制、十进制、十六进制的其他形式显示整数
以科学计数法、固定点数形式显示浮点数。
(1)二进制、八进制、十进制、十六进制输出:
对于整数类型,你可以使用b、o、d、x或X来分别指定二进制、八进制、十进制、小写十六进制或大写十六进制输出。
#include<iostream>
#include<format>
int main()
{
int i = 255;
std::cout << std::format("{:b}", i) << std::endl;
std::cout << std::format("{:o}", i) << std::endl;
std::cout << std::format("{:d}", i) << std::endl;
std::cout << std::format("{:x}", i) << std::endl;
std::cout << std::format("{:X}", i) << std::endl;
return 0;
}
//输出的结果是:
//11111111
//377
//255
//ff
//FF
如果你的X标识符是大写那输出的十六进制是大写,则那小写输出的就是小写
(2)浮点数
可以使用f、e或E来指定普通固定小数点数、小写科学计数法或大写科学计数法输出。
你还可以结合精度参数来指定小数点后的位数。
#include<iostream>
#include<format>
int main()
{
double pi = 3.141592;
std::cout << std::format("{:f}", pi) << std::endl;
std::cout << std::format("{:.3f}", pi) << std::endl;
std::cout << std::format("{:e}", pi) << std::endl;
std::cout << std::format("{:.3e}", pi) << std::endl;
std::cout << std::format("{:E}", pi) << std::endl;
std::cout << std::format("{:.3E}", pi) << std::endl;
return 0;
}
//输出的结果是:
//3.141592
//3.142
//3.141592e+00
//3.142e+00
//3.141592E+00
//3.142E+00
(3)字符
对于字符类型,通常不需要特别指定type,因为字符类型本身就有明确的输出格式。
但在某些情况下,使用{:c}可以强调你希望输出字符的字面表示,而不是其ASCII码值或其他形式。
此外,如果你想要输出字符的ASCII码值,你可以直接格式化字符为整数类型
在下面这个例子可以看出来:
#include<iostream>
#include<format>
int main()
{
char i='k';
std::cout << std::format("{:c}",i)<<'\n';
std::cout << std::format("{:d}",i)<<'\n';
return 0;
}
//输出的结果是:
//k
//107
(4)其他类型
对于其他类型,如布尔值,通常不需要指定type,因为它们的输出格式是明确的。
#include<iostream>
#include<format>
int main()
{
bool flag = true;
std::cout << std::format("{}", flag) << std::endl;
return 0;
}
//输出结果是:
//true
标签:std,main,函数,format,int,C++,格式,include,cout
From: https://blog.csdn.net/2301_80158456/article/details/136969037