我想将数字转换为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
答案 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"。
不同