C++20 Text formatting 格式化字符串, 和 python 类似。
std::formatter - cppreference.com
string — Common string operations — Python 3.12.0 documentation
新格式库位于 <format> 头文件中。格式库基于 Python3 中的 str.format() 方法建模。格式字符串基本上与 Python 中的格式字符串相同,通常可以互换。
基本格式: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} 则表示保留小数点后两位,但需要注意的是,数据类型不能是整形。
仅从 GCC 13 开始在 GCC 中可用。
C++ iomanip:
iomanip 是 C++ 标准库中的一个头文件,用于处理输入输出流中的格式化操作。
iomanip 头文件提供了一系列的流控制器(stream manipulators),可以用于格式化输入输出的方式。其中包括控制输出的精度、设置字段宽度、对齐方式等操作。
一些常用的 iomanip 控制器包括:
- std::setw():设置字段宽度
- std::setprecision():设置浮点数的精度
- std::setfill():设置填充字符
- std::left、std::right、std::internal:设置对齐方式
- std::fixed、std::scientific:设置浮点数的输出格式
- 等等。
通过包含 iomanip 头文件,并使用其中的流控制器,可以在输出流中以不同的格式进行输出,使输出结果更符合需求。
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
cout << fixed << right;
cout << setw(6) << "N" << setw(14) << "square root"
<< setw(15) << "fourth root\n";
double root;
for (int n = 10; n <= 100; n += 10)
{
root = sqrt(double(n));
cout << setw(6) << setfill('.') << n << setfill(' ')
<< setw(12) << setprecision(3) << root
<< setw(14) << setprecision(4) << sqrt(root)
<< endl;
}
return 0;
}
输出:
#include <iostream>
#include <iomanip> // std::setfill() std::setw()
//#include "stdint.h" // uintptr_t
int main()
{
int a = 10;
int* p = &a;
uintptr_t p_addr = (uintptr_t)p;
std::cout << std::uppercase << std::hex << std::setfill('0') << "Address of p = 0x" << p_addr << std::endl;
// 恢复默认的格式设置
std::cout << std::defaultfloat << std::setfill(' ');
{
std::cout << "Formatting Output Example" << std::endl;
// 设置字段宽度为10个字符,并左对齐输出
std::cout << std::setw(10) << std::left << "Name:" << std::setw(10) << std::left << "John" << std::endl;
// 设置精度为2位小数
std::cout << std::fixed << std::setprecision(2);
// 输出一个浮点数,并设置字段宽度和填充字符
std::cout << std::setw(10) << std::right << std::setfill('*') << "Value:";
std::cout << std::setw(10) << std::right << std::setfill('#') << 3.14159 << std::endl;
// 恢复默认的格式设置
std::cout << std::defaultfloat << std::setfill(' ');
}
return 0;
}
编号 | 方法和描述 |
---|---|
1 | setiosflags - 它用于设置格式标志。 |
2 | resetiosflags - 用于重置格式标志。 |
3 | setbase - 它用于设置basefield 标志。 |
4 | setfill - 它用于设置填充字符 |
5 | setprecision - 它用于设置小数精度。 |
6 | setw - 它用于设置字段宽度。 |
7 | get_money - 它用于获得货币值。 |
8 | put_money - 它用来设置计算货币的值。 |
9 | get_time - 它用于获取日期和时间。 |
10 | put_time - 它用于放置(或设置)日期和时间。 |
控 制 符 | 作 用 |
dec | 设置整数为十进制 |
hex | 设置整数为十六进制 |
oct | 设置整数为八进制 |
setbase(n) | 设置整数为n进制(n=8,10,16) |
setfill(c) | 设置字符填充,c可以是字符常或字符变量 |
setprecision(n) | 设置浮点数的有效数字为n位 |
setw(n) | 设置字段宽度为n位 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法表示 |
setiosflags(ios::left) | 输出左对齐 |
setiosflags(ios::right) | 输出右对齐 |
setiosflags(ios::skipws) | 忽略前导空格 |
setiosflags(ios::uppercase) | 在以科学计数法输出E与十六进制输出X以大写输出,否则小写。 |
setiosflags(ios::showpos) | 输出正数时显示"+"号 |
setiosflags(ios::showpoint) | 强制显示小数点 |
resetiosflags() | 终止已经设置的输出格式状态,在括号中应指定内容 |
在此需要说一下,有效位数默认是 6 位,即 setprecision(6),即小数点前面和小数点后面加起来的位数为 6 个有效数字(注意会四舍五入)。
另外,科学计数法输出 E 与十六进制输出默认是以小写的,要换成大写需添加 uppercase
而 setw(n) 设置宽度,若是实际宽度大于被设置的,则 setw 函数此时失效。
#include <iostream>
#include <iomanip>
#include <fstream>
int main()
{
// 前缀0表示八进制 前缀0x表示十六进制 不带前缀表示十进制
int a = 123;
double pi = 22.0/7.0;
// setbase(n) 设置整数为n进制(n=8,10,16)
// oct 八进制 dec 十进制 hex 十六进制
// setiosflags(ios::showbase) 显示进制的前缀
// 数值默认十进制显示输出
std::cout << a << std::endl;
std::cout << "oct: " << std::showbase << std::setbase(8) << a << " " << std::oct << a << std::endl;
std::cout << "dec: " << std::showbase << std::setbase(10) << a << " " << std::dec << a << std::endl;
std::cout << "hex: " << std::showbase << std::setbase(16) << a << " " << std::hex << a << std::endl;
// setprecision(n) 设置浮点数的有效数字为n位
// 有效位数默认是6位,即setprecision(6),即小数点前面和小数点后面加起来的位数为6个有效数字(注意会四舍五入)
std::cout << pi << std::endl;
std::cout << std::setprecision(12) << pi << std::endl;
// setfill(n) 设置字符填充,c可以是字符常或字符变量
// setw(n) 设置字段宽度为n位, 若是实际宽度大于被设置的,则setw函数此时失效, 只针对其后的第一个输出项有效
// setiosflags(ios::left) 输出左对齐
// setiosflags(ios::right) 输出右对齐 默认右对齐
std::cout << std::setfill('*') << std::setw(20) << std::setprecision(12) << pi << std::endl;
std::cout << std::setfill('*') << std::setw(20) << std::setprecision(12) << std::right << pi << std::endl;
std::cout << std::setfill('*') << std::setw(20) << std::setprecision(12) << std::left << pi << std::endl;
// setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示
std::cout << std::fixed << std::setprecision(12) << pi << std::endl;
// setiosflags(ios::scientific) 设置浮点数以科学计数法表示 科学计数法输出E与十六进制输出默认是以小写的,要换成大写需添加uppercase
std::cout << std::scientific << std::setprecision(12) << pi << std::endl;
std::cout << std::scientific << std::uppercase << std::setprecision(12) << pi << std::endl;
// resetiosflags() 终止已经设置的输出格式状态,在括号中应指定内容
std::cout << std::setiosflags(std::ios::scientific) << std::setprecision(12) << pi << " " << std::resetiosflags(std::ios::scientific) << pi << std::endl;
system("pause");
return 0;
}
使用 printf sprintf snprintf fprintf vprintf fscanf sscanf :
【C/C++】format 格式化方法使用技巧(代码实例,皆可运行)_c++ format-CSDN博客