QString::number() 'f'格式,不带尾随零
QString::number() 'f' format without trailing zeros
我想将数字转换为具有 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);
}
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 具有变量Number of Arguments的std::函数的矢量
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何以叮当格式设置评论的行长?
- QString::number() 'f'格式,不带尾随零