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

7

你们认为从QString中删除前导零的最佳方法是什么?

我正在处理像下面这样的数字:

099900000002
008800000031
88800000043

我是否必须逐个字符地迭代,还是有一种更优雅的方法使用QString::replace()函数,这是我没有想到的?


你需要直接或间接地遍历字符串。 - Stephen Chu
7个回答

14

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

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

谢谢Chris!我仍然不确定为什么有些人认为这是“过度杀伤力”,但我选择它作为我的答案,并将使用它。 - Wes
使用myString.remove(QRegExp("^[0]*"));。首先构造一个QString,然后构造一个QRegExp。然后进行匹配,这将至少与我的removeLeadingzeros一样复杂的计算。 - UmNyobe
3
我有一个习惯,在测量之前不谈论性能。我进行了一些基准测试,在我的机器上,正则表达式版本每次迭代大约需要0.012毫秒,而您的“removeLeadingZeros”版本每次迭代大约需要0.00034毫秒。虽然它明显更快,但我认为正则表达式的简单性和可读性超过了其他函数速度的好处,除非它成为瓶颈,否则不会发生这种情况,除非每秒调用数以千计。 - Chris

8

我查看了 QString 文档,没有一个简单明了并且清楚表达你想要做什么的选项。只需像这样编写:

void removeLeadingzeros(QString &s){

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

 s.remove(0,i);
}

1
很遗憾,QString没有提供类似basic_string :: find_first_not_of()的功能。 - Stephen Chu
2
为什么对于这么简单的事情你会使用正则表达式,性能才是你写 C++ 的原因,对于这个回答点赞。遗憾的是 QString 没有一个可以传入字符的修剪函数。 - demorge

2

QString mystring = "00000545465651";

mystring = QString::number(mystring.toInt());

// 结果为 mystring = "545465651";

通过将 QString 转换为整数,前导零将被删除。 然后将其转换回 QString


2
这里有一个优雅的一行代码,不使用正则表达式:
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); } - Shaun Case

1
如果您所说的优雅是指不需要自己迭代,那么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建议的那样自己迭代会更快,更清晰。


1

我不熟悉QString,所以我基于std::string来编写。也许你可以很简单地进行转换?

如果你能使用boost,那么你可以尝试这样做:

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

0
假设myString是一个数字,或者你可以通过检查ok是否为true来找出。
bool ok = false;
QString::number(myString.toLongLong(&ok));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接