C++20 Text formatting

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;
}
编号方法和描述
1setiosflags - 它用于设置格式标志。
2resetiosflags - 用于重置格式标志。
3setbase - 它用于设置basefield标志。
4setfill - 它用于设置填充字符
5setprecision - 它用于设置小数精度。
6setw - 它用于设置字段宽度。
7get_money - 它用于获得货币值。
8put_money - 它用来设置计算货币的值。
9get_time - 它用于获取日期和时间。
10put_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博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值