QString :: number()'f'格式,不带尾随零

时间:2012-09-17 12:20:57

标签: c++ qt qstring

我想将数字转换为QString,并带有3位有效数字。

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

5 个答案:

答案 0 :(得分:11)

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

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

如果你真的担心使用这种方法的性能,你可能想要提出一个不同的解决方案。

答案 1 :(得分:3)

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

将转化限制为有效数字。你总是会有3个号码。

472.76 => 472
4.7276 => 4.72

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

QString numStr;
numStr.sprintf("f.3f", myNumber);

答案 2 :(得分: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);

}

答案 3 :(得分:0)

如果你坚持小数点后的精度,你必须使用'f'。这里有一个选项可以删除尾随 zeors,其性能比仅使用 QString 内置函数的 Regex 更好:

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%。

答案 4 :(得分:-1)

QString str;
str.setNum(myNumber, 'f', 3);

这将满足您的需求,我对其进行了测试。奇怪的是,"数字"行为与" setNum"。

不同