15

我想将数字转换为QString3 位有效数字。

QString::number(myNumber,'f',3);

完成这项工作,但仍然尾随零。如何在没有它们的情况下使用它。

我也试过'g'了,不应该保持那些零:

QString::number(myNumber,'g',3);

但例如 472.76 转换为 473。这让我感到惊讶。为什么'g'选项会这样?

但是我对'f'格式感兴趣。所以主要问题是如何在'f'没有尾随零的情况下做到这一点?

输入 -> 所需输出

472.76 -> 472.76

0.0766861 -> 0.077

180.00001 -> 180

4

5 回答 5

14

我几乎不好意思发布这个,但它有效:

QString toString( qreal num )
{
    QString str = QString::number( num, 'f', 3 );

    str.remove( QRegExp("0+$") ); // Remove any number of trailing 0's
    str.remove( QRegExp("\\.$") ); // If the last character is just a '.' then remove it

    return str;
}

如果您真的担心使用此方法的性能,您可能想要提出不同的解决方案。

于 2012-09-17T20:44:15.020 回答
4
QString::number(myNumber,'g',3);

将转换限制为有效数字。你总是有 3 个数字。

472.76 => 472
4.7276 => 4.72

尝试使用格式化打印功能,如QString::sprintf. 这应该给你更多的控制权。

QString numStr;
numStr.sprintf("f.3f", myNumber);
于 2012-09-17T13:17:05.613 回答
0
QString str;
str.setNum(myNumber, 'f', 3);

这将满足您的需求,我对其进行了测试。奇怪的是,“number”的行为与“setNum”不同。

于 2012-09-17T13:22:36.577 回答
0

这个怎么样。它可能比带有正则表达式的变体更高效。mynumber() 函数采用一种新格式 char 'h',它可以完成这项工作。

QString mynumber(qreal p_number, char p_format, int p_precision)
{
    if(p_format=='h')
    {
        //like 'f' but removes trailing zeros and the '.' evtl
        QString res=QString::number(p_number,'f',p_precision);
        int countTrailingToRemove=0;
        for(QString::const_reverse_iterator it=res.crbegin();it!=res.crend();it++)
        {
            if(*it=='0') countTrailingToRemove++;
            else
            {
                if(*it=='.') countTrailingToRemove++;
                break;
            }
        }

        return res.mid(0,res.length()-countTrailingToRemove);
    }
    return QString::number(p_number,p_format,p_precision);

}
于 2020-09-23T11:27:34.453 回答
0

如果您坚持要小数点后的精度,则必须使用'f'. 这是一个删除尾随 zeor 的选项,其性能比仅使用 QString 内置的正则表达式更好:

QString str = QString::number(myNumber,'f',3);
while(str.back() =='0')
{
    str.chop(1);
}
if(str.back() =='.')
{
    str.chop(1);
}

这是有效的,因为 f 选项保证输出定义的数字。从另一个答案来看,它比 C sprintf 快 50%,比 QString::sprintf 快 40%。

于 2021-01-19T10:00:38.803 回答