我想将数字转换为具有 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

#1楼 票数:13 已采纳

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

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

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

#2楼 票数:4

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

将转换限制为有效数字。 你通常会有 3 个数字。

472.76 => 472
4.7276 => 4.72

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

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

#3楼 票数:0

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

这会做你需要的,我测试过。 奇怪的是,“number”的行为与“setNum”不同。

#4楼 票数:0

这个怎么样。 它可能比使用正则表达式的变体性能更高。 mynumber() 函数采用新的格式字符“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);

}

#5楼 票数:0

如果您坚持要小数点后的精度,则必须使用'f' 这是一个删除尾随 zeor 的选项,其性能比仅使用 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%。

  ask by krzych translate from so

未解决问题?本站智能推荐:

2回复

QString: 最多 2 个小数位的数字,不带尾随零

我有一个这样的部门: 有时它会给出 96.0000000001 之类的答案,有时该除法会按预期工作。 我想将我的数字限制为最多两位小数并且没有尾随零。 如果是96.5500000001它应该显示96.55 。 如果是96.4000000001它应该显示96.4 可以以这种方式格式化字符串
1回复

没有匹配的函数来调用'QString :: fromLatin1(QByteArray *&)'

我有一个A类,在发出信号后调用B类。 当用户关闭B ,我试图将QString值从B传递到A 为此,我首先将QString转换为QByteArray ,然后在类之间交换QByteArray 。 最后,我将QByteArray转换回QString 。 但是,在第二次转换过程中,出现此错误
1回复

QT - C ++向QString添加char'“'

我需要组成一个字符串,如: 其中1是存储在内存中的变量的值。 我的拳头尝试: 但是它不包含围绕myVar值的'“'。我只尝试过',就像这样: 但它给出了编译错误。
1回复

float到QString转换的格式

我想将一个浮点数转换为QString但是替换了. 通过a , . 例如,我希望将浮点数12.95转换为看起来像12,95的QString。 我想我可以做类似的事情: 但是我该怎么写而不是%something ? 也许我可以这样做: QString::number(my
1回复

qt c ++“ QString :: number”不保留所需的小数位

我在将数字转换为字符串并保留所有小数位时遇到麻烦。 在下面的代码中,flat和flon都声明为double并具有6个小数位(flat = 32.447134)(flon = -100.136468)。 用QString :: number,(flat = 32.4471)和(flon = -
2回复

将数字格式化为特定的 QString 格式

我有一个关于将十进制数格式化为某种 QString 格式的问题。 基本上,我的程序中有一个可以接受任何值的输入框。 我希望它将此框中的值转换为格式“+05.30”(基于值)。 该值将限制为 +/-99.99。 一些例子包括: .2 --> +00.02 -1.5 --> -01
3回复

Qt:格式化QString中的整数

我想格式化QString的整数。 我想总是有6个号码。 例如,“1”应为“000001”,“12”应为“000012”。 我尝试使用printf(%06d, number) 。 所以我写了这个 QString test; test = QString("%06d").arg(QS
1回复

如何以特定格式将QString转换为QDate?

我的GUI中有一个QDateEdit ,我将QDate转换为QString并将其添加到我的数据库中。 QString日期以以下格式保存在数据库中:2015年12月20日。 如果用户想要编辑日期,那么我需要再次在GUI上的QDateEdit字段上显示日期。 因此,我需要获取数据库,带回日