cout输出格式打印--setw、setfill、left、internal、right、showpos、noshowpos

1、用cout的成员函数进行格式设置

2、用setiosflags函数设置相应控制位

3、直接用控制符设置(本人最习惯)

直接用控制符设置

除了以上两种方式外,为了更加便捷操作,可以直接使用控制符。

控制符,也需要加上头文件#include 。

可以如下实现:

using std::cout;
using std::endl;
int nValue = 10;
cout << std::setw(10) << std::setfill('*');
cout << std::hex << std::showbase << std::left;
cout << nValue << endl;

执行结果为:

 

甚至,所有格式控制和最后的nValue输出,可以合并成一行:

cout << std::setw(10) << std::setfill('*') << std::hex << std::showbase << std::internal << nValue << endl;

是不是很方便?

下面,开始介绍各个控制符的具体含义。

考虑到现在越来越多的程序开始使用宽字节(wchar_t)进行编码,所以后面的例子中将会使用wcout而不是cout。对于格式控制,不管是wcout还是cout,都完全一致。

以下代码如果想要copy至本地编译,请加上两行代码: using std::endl; using std::wcout;

(1)setw、setfill、left、internal、right、showpos、noshowpos

这七个控制符里面,前五个是使用频率最高的,后两个是为了说明internal加到此处的。

这里面,只有setw设置后仅对下一个项目(可以理解成下一个有效输出)有效,其他的控制符一经设置一直有效,直到修改与其关联的控制符。

setw:设置宽度,为函数,参数为int型数值;

setfill:设置填充字符,为函数,参数为字符,默认填充字符是空格;

left:左对齐,即数字显示在左边,不够的再用setfill设置的字符填充;

right:右对齐,即数字显示在右边,不够的再在左侧用setfill设置的字符填充;默认对齐方式是右对齐;

internal:填充字符放到符号(正负号)和数字中间;

showpos:显示非负数字前的正号(+,pos为positive的缩写);

noshowpos:不显示非负数字前的正号,默认的是不显示。

wcout << L"----------------setw、setfill、left、internal、right、showpos、noshowpos----------------" << endl;
double dValue1 = -23.457;
double dValue2 = 3.56;
wcout << std::setfill(L'*');
int nWidth = 10;
wcout << std::setw(nWidth) << dValue2 << endl;
wcout << std::setw(nWidth) << std::left << dValue1 << endl;
wcout << std::setw(nWidth) << std::right << dValue1 << endl;
wcout << std::setw(nWidth) << std::internal << std::showpos << dValue2 << endl;
wcout << std::right << std::noshowpos;

执行结果:

(2)setprecision、fixed、scientific

setprecision:设置数字精度;

fixed:浮点数设置成普通的小数显示;

scientific:浮点数用科学计数法。

首先看一下fixed和scientific,普通的小数表示和科学计数法,很简单。

double dValue = 2563.54785243568914255;
wcout << dValue << endl;
wcout << std::scientific << dValue << endl;

执行结果为:

setprecision需要注意

setprecision,也有一些需要注意的地方,看如下代码:

double d1 = 2.222222;
double d2 = 55.555555;
wcout << std::setprecision(3);
wcout << d1 << endl;
wcout << d2 << endl;

执行结果为:

是不是与期待的有点不同?很可能是希望保留两位小数,结果55.555555成了55.6。

这里,setprecision设置的是整个数值的有效位数,而不是小数部分的有效位数。

想要设置固定的有效小数位,怎么办呢?与std::fixed控制符一起使用即可。如下:

double d1 = 2.222222;
double d2 = 55.555555;
wcout << std::setprecision(3) << std::fixed;
wcout << d1 << endl;
wcout << d2 << endl;

执行结果为:

 

保留三位小数,注意,是四舍五入原则

(3)showpoint、noshowpoint

showpoint:对于小数部分为0的浮点数,显示小数点,并且根据设置的精度,补充小数末尾部分的0;

noshowpoint:与showpoint相反

这个控制符也有一些需要注意,如果设置了setprecision和std::fixed(其实只需要设置std::fixed即可,setprecision有默认值,一般为6),即便不设置showpoint,也会显示小数末尾的0。但是仅设置setprecision不行,如:

double dValue = 22.1;
wcout << std::setprecision(5) << dValue << endl; //仅设置了setprecision,不会显示末尾0
wcout << std::fixed << dValue << endl;

执行结果为:

 

如果未设置std::fixed,仅设置std::setprecision,想要显示小数末尾部分的0,则可以用std::showpoint。

需要注意,此时的setprecision表示的精度,不是小数部分,而是整个数值。如下:

double dValue = 22.1;
wcout << std::setprecision(5) << std::showpoint << dValue << endl;

执行结果如下:

 

(4)oct、dec、hex、showbase以及noshowbase

oct:八进制,前缀为:0;

dec:十进制,没有前缀,为进制的默认值;

hex:十六进制,前缀为:0x

showbase:显示进制的前缀;

noshowbase:不显示进制前缀。

这些控制符,都是一经设置一直有效。

int nValue_dec = 10;
wcout << std::oct << nValue_dec << endl; //八进制,默认不显示前缀
wcout << std::showbase << nValue_dec << endl; //打开前缀,还是输出上一行设置的八进制
wcout << std::hex << nValue_dec << endl; //十六进制,已设置过现实显示前缀
wcout << std::dec << nValue_dec << endl; //十进制,没有前缀
wcout << std::noshowbase << nValue_dec << endl;

执行结果:

(5)boolalpha、noboolalpha

boolalpha:将bool类型的变量输出为'true'或者'false'字样。

boolalpha:将bool类型的变量输出为1和0字样,默认为noboolalpha。

wcout << L"---------------------------boolalpha、noboolalpha----------------------------------" << endl;
bool bTrue = true;
bool bFalse = false;
wcout << bTrue << endl; //1
wcout << bFalse << endl; //0
wcout << std::boolalpha << bTrue << endl; //true
wcout << bFalse << endl; //false
wcout << std::noboolalpha << bTrue << endl; //1


执行结果:

 

(6)uppercase、nouppercase

uppercase:对于进制前缀、十六进制a-f和浮点数科学计数法的字母e,均显示大写字母;

nouppercase:对于进制前缀、十六进制a-f和浮点数科学计数法的字母e,均显示小写字母,为默认值;

注意:对其他的(包括浮点数的true和false)无影响。

int nValue = 10;
bool bValue = true;
double dValue = 2.354;
wcout << std::boolalpha << std::hex << std::showbase << std::scientific;
wcout << nValue << endl;
wcout << bValue << endl;
wcout << dValue << endl;
wcout << std::uppercase;
wcout << nValue << endl;
wcout << bValue << endl;
wcout << dValue << endl;
wcout << std::nouppercase;

执行结果为:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值