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

QString::number() 'f' format without trailing zeros

本文关键字:格式 number QString      更新时间:2023-10-16

我想将数字转换为具有 3 位有效数字的 QString

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

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

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

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

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

将转换限制为有效数字。您最多总是有 3 个数字。

472.76 => 472
4.7276 => 4.72

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

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

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

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

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

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

这个

怎么样。它可能比具有正则表达式的变体性能更高。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);
}