记得添加 format模块
基本格式:format(填充与对齐(可选) 符号(可选) #(可选) 0(可选) 宽度(可选) 精度(可选) L(可选) 类型(可选))
std::cout << std::format("{:.2}", std::numbers::pi); //print : 3.1
std::cout << std::format("{:.2f}", std::numbers::pi); //print : 3.14
上述代码区别在于中括号内是否加入f关键字,也就是说若{:.2}则指保留两位有效数字,{:.2f}则表示保留小数点后两位,但需要注意的是,数据类型不能是整形
std::cout << std::format("{:6}|{:<6}|{:>6}|{:^6}", 233, 233, 233, 233); //printf : 233|233 | 233| 233
6指预留6个单位的空间用于输出,默认空格补齐,< > ^ 分别意为左对齐,右对齐,居中,系统默认为右对齐
std::cout << std::format("{0:*^7}|{0:0^7}", 233); //print : **233**|0023300
在此例子中,:前的0表示选取输出元素,也就是说在引号后的内容是被默认标注了顺序的,从0开始依次递增,因此你可以自定义数据输出的顺序;*(或其他字符都可)与^,<,>搭配使用可用于填充剩余空间,默认为空格
std::cout << std::format("{0:e}|{0:g}|{0:a}|", 233.0); //printf : 2.330000e+02|233|1.d2p+7|
std::cout << std::format("{0:b}|{0:x}", 233); //printf : 11101001|e9
在上述代码中,语句一的e,g,a分别代表科学格式化,常规格式化,十六进制格式化;语句二中的b,x分别代表二进制格式化和十六进制格式化但不允许使用precision选项
double a = 233;
std::cout << std::format("{0:x}|{0:#x}|{1}|{1:#}", 233,a); //print : e9|0xe9|233|233.
此处的#会在格式化后为其输出对应的格式(对于整数,替代形式会添加基数前缀(0x或0b;如果使用大写的E,G,A,B,X,那么效果是相同的,只不过输出的任何字母都将变为大写包括NaN值和无穷大值),对于浮点数,会使输出总是包含小数点,即使其后没有数字),可在输出中对比看出
std::cout << std::format("{0:+}|{1:+}|{0:-}",233 ,-233); //print : +233|-233|233
在sign的位置可使用字符,可在正数前加’+‘符号,也就是可以在非负数前加’+'或空格符
使用format制表
const auto table_format = "{:>8} {:>8} {:>20}\n";
std::cout << std::format(table_format, "Name", "Age", "Score");
for (int i = 0; i < 10; i++)
{
std::cout << std::format(table_format, i, i * i, i + 50);
}
输出:
Name Age Score
0 0 50
1 1 51
2 4 52
3 9 53
4 16 54
5 25 55
6 36 56
7 49 57
8 64 58
9 81 59