【发布时间】:2012-01-06 15:32:12
【问题描述】:
你们认为从 QString 中删除前导零的最佳方法是什么?
我正在处理这样的数字:
099900000002
008800000031
88800000043
我是否必须一次一个地遍历每个字符,或者是否有一种更优雅的方式使用我没有想到的 QString::replace() 函数?
【问题讨论】:
-
您必须直接或间接地遍历字符串。
你们认为从 QString 中删除前导零的最佳方法是什么?
我正在处理这样的数字:
099900000002
008800000031
88800000043
我是否必须一次一个地遍历每个字符,或者是否有一种更优雅的方式使用我没有想到的 QString::replace() 函数?
【问题讨论】:
从字符串的开头删除任意数量的零:
myString.remove( QRegExp("^[0]*") );
【讨论】:
myString.remove( QRegExp("^[0]*") ); 首先你构造一个QString,然后是一个QRegExp。然后你进行匹配,这在计算上至少和我的removeLeadingzeros一样复杂。
removeLeadingZeros 版本每次迭代大约需要 0.00034 毫秒。虽然它肯定更快,但我认为 RegEx 的简单性和可读性超过了其他函数的速度带来的好处,直到它成为瓶颈。除非每秒被调用数千次,否则不太可能发生的事情。
我查看了QString 文档,没有一个简单且明确说明您想要做什么的文档。就这样写
void removeLeadingzeros(QString &s){
int i = 0;
while(i < s.length() && s[i]=='0'){
i++;
}
s.remove(0,i);
}
【讨论】:
我不熟悉 QStrings,所以我基于 std::string。也许你可以很简单地转换?
如果您可以使用 boost,那么您可以执行以下操作:
std::string s("000003000000300");
boost::trim_left_if( s, boost::is_any_of("0") );
【讨论】:
如果优雅是指不迭代自己,那么 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 的建议迭代自己,这样更快更清晰。
【讨论】:
这是一个不使用正则表达式的优雅单行:
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'; } )));
速度非常快。
【讨论】:
while (s.startsWith('0') && s != "0") { s.remove(0,1); }
QString mystring = "00000545465651";
我的字符串 = QString::number(mystring.toInt());
// 结果 = mystring = "545465651";
通过将QString 转换为整数,将删除前导零。
比你把它转换回QString。
【讨论】:
假设myString是一个数字,或者你可以通过检查ok是否是true来找出答案
bool ok = false;
QString::number(myString.toLongLong(&ok));
【讨论】: