【问题标题】:QTextStream align by dot (decimal separator)QTextStream 按点对齐(小数分隔符)
【发布时间】:2017-05-21 04:28:00
【问题描述】:

我正在使用 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

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

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

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

    未经测试:

    // 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;
    

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多