QTextStream按点对齐(小数点分隔符)

时间:2017-05-21 04:28:01

标签: c++ qt text qt5 c++14

我正在使用QTextStream将数据写入文件。它组织得很好(几乎完美),如:

i           t           y          yy           
0   0.0166667   -0.649999     67.6666           
1   0.0333333    0.477777    -43.4444           
2        0.05   -0.246295     30.6295           
3   0.0666666    0.264197     -18.753           
4   0.0833333  -0.0483533     14.1687           
5         0.1    0.187791     -7.7791           
6    0.116667   0.0581394     6.85273           
7    0.133333    0.172351    -2.90181           
8        0.15    0.123988     3.60121           
9    0.166667    0.184008   -0.734136

以上是由

制作的
    stream <<  qSetFieldWidth(5)  << i
           <<  qSetFieldWidth(12) << t
           <<  qSetFieldWidth(12) << y
           <<  qSetFieldWidth(12) << yy
           << endl;

但我希望列以点(小数分隔符)对齐,如:

0   0.0166667   -0.649999     67.6666           
1   0.0333333    0.477777    -43.4444           
2   0.05        -0.246295     30.6295           
3   0.0666666    0.264197    -18.753           
4   0.0833333   -0.0483533    14.1687           
5   0.1          0.187791     -7.7791           
6   0.116667     0.0581394     6.85273           
7   0.133333     0.172351     -2.90181           
8   0.15         0.123988      3.60121           
9   0.166667     0.184008     -0.734136

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您必须将数字分为积分(右对齐)和小数部分(左对齐)(并从小数表示中去掉前导零)。

更简单的方法是使用适合整数表示中的位数的空格填充输出(也考虑符号)。

UNTESTED:

// inefficient, but illustrates the concept:
int NumIntDig(double x) {
    stringstream s;
    s << int(x);
    return s.str().size();
} 

stream <<  qSetFieldAlignment(AlignRight) << qSetFieldWidth(5)  << i
       <<  qSetFieldAlignment(AlignLeft) <<
       <<  qSetFieldWidth(4-NumIntDig(t)) << " "  
       <<  qSetFieldWidth(8+NumIntDig(t)) << t
       <<  qSetFieldWidth(4-NumIntDig(y)) << " "  
       <<  qSetFieldWidth(8+NumIntDig(t)) << y
       <<  qSetFieldWidth(4-NumIntDig(yy)) << " "  
       <<  qSetFieldWidth(8+NumIntDig(t)) << yy
       << endl;