【C++】数字输出格式

前言

        习惯了使用C++之后是真的愿意用cout代替printf,但是cout又不能像printf那样可以%5d啊,%-5d这种,那么可以浅用几种方式来进行有效的格式表示

        首先声明我对这方面知识了解的不是很多,我认为达到一种:需要的时候能排上一点用场的效果,就okk了,也希望大家多多指正哈。


setw

        字段宽度。也就是说等同于%5d这种的存在的。

        头文件:#include<iomanip>

cout << setw(5) << 123 << endl;
cout << setw(5) << 123 << setw(3) << 45 << endl;
cout << setw(5) << 123456 << endl;

        第一行的意思是:

        一共占据5个空格区域,其中123贴在右侧。

        将会以:空空123的形式展示出来。

        第二行想说明的的是:

        setw必须是紧贴着要输出的内容进行格式控制,setw+要输出的内容,必须是在它的后面紧挨着。

        123是5个空格空间,而后面的45就只有3个空格空间而已。

        将会以:空空123空45的形式显示。

        第三行想说明的是:

        如果数字超过了控制范围,那么就都说没控住...

        还是会以正常的123456显示。


left/right        

        setw默认的是靠近右侧,但是如果想左侧怎么办呢?

cout << setw(5) << left << 123 << endl;
cout << setw(6) << 123 << endl;
cout << setw(5) << right << 123 << endl;

        

        使用std标准库里的left。

        这里要说明一下:我们可能看到的都是std::left,但是只要我们把std命名空间在前面声明打开了之后,直接使用left是可行的。

        那么输出从空空123,变成了123空空。

        第二行我们看到,并没有输入left,也是靠左侧了!

        这就是说明left(以及下面的right)直接改变了cout的输出格式,使得以后的cout全部按照这种形式输出。当然了,left和right仅适用于setw函数存在的情况。

        right同理于left,但是我们默认就是右侧,所以正常在没有写过左侧的情况,是不用写出来的,使用的意义可能在于恢复原始的右侧对齐...


setfill

        将空格填充为特定的字符,与setw配合使用。

        要注意的是:首先填充的必须是字符,char类型。

        其次,可以单独使用。

cout << setw(5) << left << setfill('-') << 123 << endl;
cout << setw(5) << setfill('-') << 1.5 << endl;
cout << setw(6) << 100 << endl;

       

        那么第一行结果就是:123--。

        而第二行是:1.5--,小数点也会占据一个空格位置。

        第三行我们并没有指明setfill,但是输出的结果却是:100---。

        那么到这里,结合刚才的left,也认为,setfill会改变输出格式,只不过改变的是此后的setw。

        但是话说回来,你的left、right以及setfill,在没有使用setw的情况下,对cout是没影响的,因为不涉及到占位。

cout << setfill(' ') << right;//恢复原来的默认
cout << setw(6) << 100 << endl;

        默认填充的是空格,以及右侧贴靠,这样就变回了原始的setw。


setiosflags

        设置指定标志

        这个需要很多参数,来组成不同的形式。

        首先头文件还是<iomanip>

        但是在实际使用中发现,例如此后的内容fixed,我们写:

        setiosflags(ios::fixed)与直接写fixed是一样的。

cout << setiosflags(ios::fixed) << 123.456 << endl;
cout << fixed << 123.456 << endl;

fixed/scientific

        fixed指的是:流的格式化。

        将流的格式设置为:fixed,意思是:

        将一个浮点数表示为,一个定点整数小数点小数部分的格式。

        值得注意的是,在C语言中,小数是默认是保留6位,但是C++可以直接输出,省去了后面无意义的0,但是用了fixed之后,就又变成了123.456000。

double a = 123.456;
cout << a << endl;
cout << fixed << a << endl;
cout << a << endl;

        

         首先上文提到fixed与setiosflags(ios::fixed)是一样的。

        其次,我们发现,fixed改变了cout的输出格式,但是仅限于double或float,int无效的,不会将100变成100.000000。

        而scientific则是科学计数法,见名知意嘛。

cout << scientific << a << endl;
cout << a <<endl;

        这里要提的是科学计数法的表示,就是e加上三个字符的表示,其中,符号占1位。

        其次,scientific与fixed是一样的,改变了cout。

        那么问题来了:咋变回去呢?

        那么就要用到resetiosflags了,这个貌似是不能省略的,不能像fixed一样。

        因为我们如果用了其他形式的输出,是要恢复成原样的。

cout << resetiosflags(ios::scientific);
//cout << resetiosflags(ios::scientific) << resetiosflags(ios::fixed);
cout << a <<endl;

        就是将最后一次的修改变为正常,如果你忘了是改成什么样子了,可以两个都反修改


setprecision

        这个函数的意思是,保留多少位有效数字,例如123.456如果保留5位有效数字的话,就变成了:123.46,进行四舍五入。

        这里就可以讲:如果我们想保留的是小数呢?

        例如说是我想把123.456变成123.456000这种。

        就要用fixed与setprecision向结合的方式。

double a = 123.456;
cout << setprecision(5) << a << endl;
cout << fixed << setprecision(5) << a << endl;
cout << resetiosflags(ios::fixed) << setprecision(5) << a << endl;

        如果不加,就是有效数字;如果加了,就是保留小数了。

        第三行只是将其改变回来正常的输出。


hex/dec/oct

        hex是十六进制,dec是十进制,oct是八进制。

        先来句题外话,这个怎么记住呢?我认为还是挺有意思的,这个好像是我考研英语老师讲的。

        说啊~在很久以前的国外是没有一月和二月的(但是具体是因为什么我不记得了...),因此以前是March是一月,那么以这个逻辑以此类推,October就不是十月了,就是八月了,诶,你会发现,octopus意思是八爪鱼,也是oct开头,那么oct就是八的前缀~

        再推,December是十二月,变成了十月,decade意思是十年对吧,你看,dec就是十的前缀!

        你看学到英语了还!

        至于hex我不知道,貌似人家本身就有十六进制的意思,不过我记得hex好像是炉石里萨满的妖术那张牌...

        言归正传!!!

int b = 55;
cout << b << endl;
cout << hex << b << endl;
cout << b << endl;
cout << oct << b << endl;
cout << dec;
cout << b << endl;

         我们的输出默认是十进制dec,而如果加入了hex就变成了十六进制,55=0x37。

        此时的cout完全变成了输出十六进制,道理同fixed。

        如果想回复十进制只需要cout<<dec;即可。

showbase

cout << hex << showbase << b << endl;
cout << hex << noshowbase << b << endl;
cout << dec << noshowbase;

         showbase意思是,如果不是十进制,那么就把该数字的前缀显示出来。

        而我们默认是noshowbase,因此最后一样的意思是回复原始。


总结

        setprecision和setw的使用次数还是很多的,如果我们改变了cout,一定不要忘记改回来!

        今天的分享就到这里了~感谢大家~

  • 24
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值