有时候需要利用c++进行格式化输出,比如指定位数、不足用0补齐、按列靠右对齐等等。
一般有两种方法:
– 利用iostream对象成员函数修改格式状态值
< ios >或者< iostream >里定义了iostream类的成员函数,比如函数setf,可以设置相应的format flags,比如cout.setf(fixed)会设置cout的浮点数以定点而不是科学计数法来输出。
– 向对象中输出< iomanip >中的操作符
比如
cout<<setw(8)
设置最小输出宽度
下面根据各种功能对两种方式进行说明。
设定最小宽度
int main()
{
double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592;
cout<<cout.width()<<endl;
cout.width(8);
cout<<a0<<endl;
cout<<a0<<endl;
cout<<setw(8)<<a0<<endl;
cout<<a0<<endl;
return 0;
}
//输出
0
3
3
3
3
cout.width()返回cout的输出最小宽度值,默认为0,width(8),修改width值为8,然后下一个输出靠右对齐左边用空格补齐,第二次输入a0的时候,发现width(8)失效了,说明width值修改只影响下一次输出,并没有更改cout的格式状态值。setw()的作用是一样的,只是使用方式的区别。
只输出a0,我们还无法知道两个问题:小数点算不算是宽度,如果待输出宽度大于设定的最小宽度值怎么办
int main()
{
double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592;
cout<<setfill('0')<<setw(8)<<a3<<endl;
cout<<setw(5)<<a5<<endl;
return 0;
}
//输出
0003.141
3.14159
set fill
设定了位数不足时用什么字符来补齐,第一个输出告诉我们,小数点也算在内,第二个输出告诉我们,width或者setw只是设定了最小宽度,当待输出宽度大于该值时,不受影响,全部输出。
控制浮点数格式
默认情况下,标准库会根据值的大小选择定点十进制还是科学计数法来输出:对于非常大的数或者非常小的数,用科学计数法来输出,否则打印为定点十进制。当然我们也可以自己设定浮点数格式,同样有两种方法。
int main()
{
double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592;
cout.setf(ios::fixed);
cout<<a6<<endl;
cout.setf(ios::scientific);
cout<<a6<<endl;
}
//输出
3.141592
0x1.921fafc8b007ap+1
设定精确度
与宽度类似,有两种方法
precision()
和
setprecision()
,但是精确度的理解与当前流对象的浮点输出格式有关,默认情况下,precision指的是整数部分和小数部分位数之和,使用fixed或者scientific时,指的是小数部分的位数。默认精度为6位。
当待输出浮点数精度高于设定值时,
四舍五入
而不是简单的截断。
int main()
{
double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592,a7=3.141595;
cout<<a6<<endl; //输出3.14159,共6位,小数2舍去
cout<<a7<<endl; //输出3.1416 ,其实是3.14160,末尾0舍去了,5进位了
cout.setf(ios::fixed);
cout<<a6<<endl;//3.141592
}
也可以用
precision()
函数来做。
其实还可以格式化输入,以后再来探讨。