从 QString 中删除前导零的最佳方法

Posted

技术标签:

【中文标题】从 QString 中删除前导零的最佳方法【英文标题】:Best way to remove leading zeros from a QString 【发布时间】:2012-01-06 15:32:12 【问题描述】:

你们认为是什么?

我正在处理这样的数字:

099900000002
008800000031
88800000043

我是否必须一次一个地遍历每个字符,或者是否有一种更优雅的方式使用我没有想到的 QString::replace() 函数?

【问题讨论】:

您必须直接或间接地遍历字符串。 【参考方案1】:

从字符串的开头删除任意数量的零:

myString.remove( QRegExp("^[0]*") );

【讨论】:

谢谢克里斯!我仍然不确定为什么有些人认为这是“完全矫枉过正”,但我选择这个作为我的答案,我会使用它。 myString.remove( QRegExp("^[0]*") ); 首先你构造一个QString,然后是一个QRegExp。然后你进行匹配,这在计算上至少和我的removeLeadingzeros一样复杂。 我养成了在衡量性能之前不谈论性能的习惯。我做了一些基准测试,在我的机器上,RegEx 版本每次迭代大约需要 0.012 毫秒,而您的 removeLeadingZeros 版本每次迭代大约需要 0.00034 毫秒。虽然它肯定更快,但我认为 RegEx 的简单性和可读性超过了其他函数的速度带来的好处,直到它成为瓶颈。除非每秒被调用数千次,否则不太可能发生的事情。【参考方案2】:

我查看了QString 文档,没有一个简单且明确说明您想要做什么的文档。就这样写

void removeLeadingzeros(QString &s)

 int i = 0;
 while(i < s.length() && s[i]=='0')
  i++;
 

 s.remove(0,i);

【讨论】:

太糟糕了 QString 没有提供类似 basic_string::find_first_not_of() 的东西。 你为什么要用正则表达式来做这么简单的事情,性能就是你写 c++ 的原因吗? +1 这个答案。 Shame QString 没有可以输入字符的修剪功能。【参考方案3】:

我不熟悉 QStrings,所以我基于 std::string。也许你可以很简单地转换?

如果您可以使用 boost,那么您可以执行以下操作:

std::string s("000003000000300");
boost::trim_left_if( s, boost::is_any_of("0") );

【讨论】:

【参考方案4】:

如果优雅是指不迭代自己,那么 Qt 容器在很大程度上与 STL 算法兼容这一事实可能会有所帮助(但不一定高效):

QString::iterator n = std::find_if(myQString.begin(), myQString.end(), std::bind2nd(std::not_equal_to<QChar>(), '0'));
myQString.remove(0, n-myQString.begin());

花式。但是你最好按照 UmNyobe 的建议迭代自己,这样更快更清晰。

【讨论】:

【参考方案5】:

这是一个不使用正则表达式的优雅单行:

while (s.startsWith('0'))  s.remove(0,1); 

不是最快的,但它比正则表达式版本快得多。另外,如果你有 C++11,你可以这样做:

s.remove(0,
         std::distance(s.begin(),
                       std::find_if_not(s.begin(), s.end(),
                                        [](QChar c)  return c == '0';  )));

速度非常快。

【讨论】:

这些非常好,但是将诸如“00000000”之类的全零序列转换为空字符串,这可能不是理想的行为。我会将第一个修改为while (s.startsWith('0') &amp;&amp; s != "0") s.remove(0,1); 【参考方案6】:

QString mystring = "00000545465651";

我的字符串 = QString::number(mystring.toInt());

// 结果 = mystring = "545465651";

通过将QString 转换为整数,将删除前导零。 比你把它转换回QString

【讨论】:

【参考方案7】:

假设myString是一个数字,或者你可以通过检查ok是否是true来找出答案

bool ok = false;
QString::number(myString.toLongLong(&ok));

【讨论】:

以上是关于从 QString 中删除前导零的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

删除 perl 字符串中所有前导零的最优雅和最快的方法

从Javascript中的数字中删除前导零[重复]

填充数字格式的时间表达式,具有带前导零的可变分隔符

QString与string互转以及显示中的乱码问题

从输入 type=number 中删除前导零

JavaScript 中前导零的数字