你们认为从QString中删除前导零的最佳方法是什么?
我正在处理像下面这样的数字:
099900000002
008800000031
88800000043
我是否必须逐个字符地迭代,还是有一种更优雅的方法使用QString::replace()函数,这是我没有想到的?
从字符串开头删除任意数量的零:
myString.remove( QRegExp("^[0]*") );
myString.remove(QRegExp("^[0]*"));
。首先构造一个QString
,然后构造一个QRegExp
。然后进行匹配,这将至少与我的removeLeadingzeros
一样复杂的计算。 - UmNyobe我查看了 QString
文档,没有一个简单明了并且清楚表达你想要做什么的选项。只需像这样编写:
void removeLeadingzeros(QString &s){
int i = 0;
while(i < s.length() && s[i]=='0'){
i++;
}
s.remove(0,i);
}
QString mystring = "00000545465651"
;
mystring = QString::number(mystring.toInt());
// 结果为 mystring = "545465651";
通过将 QString
转换为整数,前导零将被删除。
然后将其转换回 QString
。
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); }
- Shaun CaseQString::iterator n = std::find_if(myQString.begin(), myQString.end(), std::bind2nd(std::not_equal_to<QChar>(), '0'));
myQString.remove(0, n-myQString.begin());
很花哨。但是像UmNyobe建议的那样自己迭代会更快,更清晰。
我不熟悉QString,所以我基于std::string来编写。也许你可以很简单地进行转换?
如果你能使用boost,那么你可以尝试这样做:
std::string s("000003000000300");
boost::trim_left_if( s, boost::is_any_of("0") );
myString
是一个数字,或者你可以通过检查ok
是否为true
来找出。bool ok = false;
QString::number(myString.toLongLong(&ok));