首页 > 编程语言 >C++的format函数

C++的format函数

时间:2024-03-26 19:59:11浏览次数:23  
标签:std main 函数 format int C++ 格式 include cout

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

相关文章

  • 05-python函数进阶和文件
    函数函数的多返回值变量间逗号隔开,可以多种类型defhello():return1,True,"hello"x,y,z=hello()函数的传参方式位置参数,根据位置传参defcan1(x,y,z):print(x,y,z)can1(2,4,8)关键字参数,根据k=v传参,可以和位置参数混用,位置参数需要在前defcan2......
  • CMakeLists_find_package以及C++基本语法
    命令catkin_make等效于以下指令:cd~/catkin_wscdsrccatkin_init_workspacecd..mkdirbuildcdbuildcmake../src-DCMAKE_INSTALL_PREFIX=../install-DCATKIN_DEVEL_PREFIX=../devel命令cmake与makeinstall-DCMAKE_BUILD_TYPE=:releasedebug-DCMAK......
  • Oracle数据库入门第三课(函数)
    前面二白讲了一些简单的查询语句,仅仅知道查询语句的语法是不够的,要想实现更多的需求,更重要的是函数的使用,这节课我们简单说一下一些函数的使用。一、函数的分类什么叫做函数?函数就是用来实现某种功能的,提前声明好的代码块分类:•系统函数         ‣单行函数......
  • 一个C/C++出身的程序员,如果想成为一个黑客,需要多久时间?
    黑客,在没有学习编程的人眼中,是无所不能的存在,盗密码,黑网站,网络入侵,偷取数据等,一台电脑,全部搞定!而且很多同学的话开始学习编程的原因就是被黑客的这个技术所吸引的。说起来,好像笔者当年也觉得黑客很厉害,所以的话多多少少我成为C/C++工程师也是有以前的因素的影响,不过后来接触......
  • Python函数式编程自带函数
    一.map函数需求1:num1=[1,2,3,4],我的需求是把num1中的每个元素平方后组成新列表。ret=[]num1=[1,2,3,4]foriinnum1:ret.append(i**2)print(ret)#输出结果:>>>[1,4,9,16]需求2:如果有1万个列表呢,怎么办?思路:如果用for循环,当然功能上是没问题的,但是需要......
  • ccf-csp-2020-12-2期末预测之最佳阈值(c++满分题解)
    这个题暴力是可以有70分的,下面是暴力代码:(注释写的比较清楚了,也很好理解)#include<iostream>#include<vector>#include<set>#include<algorithm>usingnamespacestd;boolsort1(pair<int,int>vec1,pair<int,int>vec2)//对阈值从小到大排序{ returnvec1.first<=ve......
  • CUTLASS: Fast Linear Algebra in CUDA C++
    https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/EfficientMatrixMultiplicationonGPUs计算密集度=(时间复杂度/空间复杂度)=O(N^3)/O(N^2)=O(N)//naivefor(inti=0;i<M;++i)for(intj=0;j<N;++j)for(intk=0;k<......
  • c++栈内存溢出问题
    问题说明实验课测量快排时间时,用intar[MAXSIZE+1];来创建数组,数据规模从1000-10000,而MAXSIZE的设置不能超过600000,超过了程序就无法运行直接中断,理论上这是不应该。程序中用rand()生成随机数据,但若对数据求模rand()%100,则程序运行到中途会异常中断。问题原因intar[M......
  • Android证书校验出现java.io.IOException: Invalid keystore format错误的解决方案
    使用下面命令keytool-list-v-keystore签名.keystore出现错误java.io.IOException:Invalidkeystoreformat一般出现这种错误的情况有2种可能1.密码错误2.JDK版本问题1.如果是JDK8生成的keystore,然后用JDK11(+)执行是没问题的,当前情况不需要解决,因为是成功......
  • 【RTE里Rte_DRead函数和Rte_Read函数在代码里的区别】
    前言使用RTE时,常会使用到Rte_DRead和Rte_Read函数,今天以代码视角看看二者的区别。应用层在应用层调用Rte_DRead接口函数读取CAN信号值。read_isSignalA=Rte_DRead_Isignal_isSignalA_Isignal_isSignalA();在应用层调用Rte_Read接口函数读取CAN信号值。Rte_Read......