在项目中,经常需要对输出流进行格式化,那么今天小豆君就给大家介绍下输出流的格式化使用说明。
1 设置数字的输出格式
可以使用QTextStream类的setNumberFlags方法,指定数字的输出格式,它的标志位含义介绍如下:
- QTextStream::ShowBase 指定以哪一种进制进行显示,16 ("0x"), 8 ("0"), or 2 ("0b")。
- QTextStream::ForcePoint 如果输出类型是double或float,若这个数字不含小数部分,默认情况下不显示小数部分,若设置了该标志位,则显示小数部分(.)。
- QTextStream::ForceSign 在输出的数字前面加上正负号,即"+"或"-"。
- QTextStream::UppercaseBase 在进制指示中,使用大写字母表示,如"0X", "0B"。
- QTextStream::UppercaseDigits 使用大写字母来表示10到35位数字,而不是小写。例如16进制中的a-f都用大写字母表示,或者科学计数法中的e使用大写E。
int main() { QTextStream out(stdout); int i = 60; out.setIntegerBase(16);//设置16进制显示,所以使用输入输出流,也可以很容易的进行进制转换 out << i << endl; //output:3c out.setNumberFlags(out.numberFlags()|QTextStream::ShowBase); out << i << endl; //output: 0x3c out.setNumberFlags(out.numberFlags()|QTextStream::ForceSign); out << i << endl; //output: +0x3c out.setNumberFlags(out.numberFlags()|QTextStream::UppercaseBase); out << i << endl; //output: +0X3c out.setNumberFlags(out.numberFlags()|QTextStream::UppercaseDigits); out << i << endl; //output: +0X3C double d = 100; out << d << endl;//output: 100 out.setNumberFlags(QTextStream::ForcePoint); out << d << endl;//output: 100.000 }
2 宽度,填充和对齐方式
2.1 宽度
可以调用setFieldWidth来设置输出流的宽度,所谓宽度是指,当在流中输出一个数时,至少产生宽度值所规定数量的字符。如果插入字符的个数小于宽度值,则用某个字符对空余的位置进行填充。
一定注意,这里的宽度是指定输出字符的最小数目,如果数目不够,则使用填充字符进行填充,而不会截断输出。如果你设置宽度为2时输出1234,仍会得到1234。
QTextStream的宽度设置与标准库的有一点不同,它不需要像标准库那样,在每一个输出符前都需要设置一次宽度。
2.2 对齐方式
对齐方式一般和宽度一起使用,
- QTextStream::AlignLeft 左对齐
- QTextStream::AlignRight 右对齐
- QTextStream::AlignCenter 居中
- QTextStream::AlignAccountingStyle 和AlignRight一样,只是数字的符号是左对齐的。
int main() { QTextStream out(stdout); int i = 60; out.setFieldWidth(6); out << i << endl; //output: 60 out.setPadChar('-'); out << i << endl; //output:----60 out.setFieldAlignment(QTextStream::AlignLeft); out << i << endl; //output:60---- out.setFieldAlignment(QTextStream::AlignRight); out << i << endl; //output:----60 out.setFieldAlignment(QTextStream::AlignCenter); out << i << endl; //output:--60-- out.setNumberFlags(QTextStream::ForceSign); out.setFieldAlignment(QTextStream::AlignAccountingStyle); out << i << endl; //output:+---60 }
3 精度
请看下面的程序:
QTextStream out(stdout); double d = 12.3456789; out << d << endl; //output:12.3457 Q_ASSERT(d==12.3456789);
此程序预想的输出结果应该是12.3456789,但实际的输出结果是12.3457,那么,是d的值改变了吗。当然没有,因为Q_ASSERT测试为真。
这是因为QTextStream 的精度默认设置为6,而如果想要改变它的默认精度,则可以使用setRealNumberPrecision方法。
QTextStream out(stdout); out.setRealNumberPrecision(10); double d = 12.3456789; out << d << endl; //output:12.3456789 Q_ASSERT(d==12.3456789);
好了,关于QTextStream的格式化输出就先介绍到这里。
最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。