从 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') && 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 中删除前导零的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章