C++ 从QString中删除前导零的最佳方法
你们认为从Q字符串中删除前导零的最好方法是什么 我处理的数字如下:C++ 从QString中删除前导零的最佳方法,c++,qt,qt4,C++,Qt,Qt4,你们认为从Q字符串中删除前导零的最好方法是什么 我处理的数字如下: 099900000002 008800000031 88800000043 我是否必须一次迭代每个字符,还是有一种更优雅的方式使用我没有想到的QString::replace()函数?我不熟悉QString,所以我基于std::string。也许你可以很简单地转换 如果可以使用boost,则可以执行以下操作: std::string s("000003000000300"); boost::trim_left_if( s, b
099900000002
008800000031
88800000043
我是否必须一次迭代每个字符,还是有一种更优雅的方式使用我没有想到的QString::replace()函数?我不熟悉QString,所以我基于std::string。也许你可以很简单地转换 如果可以使用boost,则可以执行以下操作:
std::string s("000003000000300");
boost::trim_left_if( s, boost::is_any_of("0") );
从字符串开头删除任意数量的零:
myString.remove( QRegExp("^[0]*") );
我查看了
QString
doc,没有一个是简单的,同时明确了您想要做什么。就这样写吧
void removeLeadingzeros(QString &s){
int i = 0;
while(i < s.length() && s[i]=='0'){
i++;
}
s.remove(0,i);
}
void removeReadingZero(QString&s){
int i=0;
而(i
如果您所说的优雅是指不自己迭代,那么Qt容器基本上与STL算法兼容这一事实可能会有所帮助(但不一定有效):
QString::iterator n=std::find_if(myQString.begin(),myQString.end(),std::bind2nd(std::not_equal_to(),'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'; } )));
这非常快。假设
myString
是一个数字,或者您可以通过检查ok
是否为true
bool ok = false;
QString::number(myString.toLongLong(&ok));
QString mystring=“00000546565651”
mystring=QString::number(mystring.toInt())代码>
//结果=mystring=“5454651”
通过将QString
转换为整数,前导零将被删除。
比u只将它转换成<代码> qString 。你必须直接或间接地迭代字符串。太坏了QString不能提供类似Basic字符串::FiffyFixSTyNoToFo()。为什么你会用ReGEX做一些简单的操作,这就是为什么你写C++ +?对于这个答案,我的答案是1。可惜QString没有一个修剪功能,你可以给角色添加。谢谢Chris!我仍然不知道为什么有些人认为这是“完全的过度使用”,但我选择这个作为我的答案,我会使用它
首先构建一个QString
,然后构建一个QRegExp
。然后进行匹配,这将在计算上至少与我的RemoveReadingZeros
一样复杂。我习惯在测量性能之前不谈论性能。我做了一些基准测试,在我的机器上,RegEx版本每次迭代大约需要.012ms,而您的removeLeadingZeros
版本每次迭代大约需要.00034ms。虽然它确实快了很多,但我认为RegEx的简单性和可读性超过了其他函数的速度,直到它成为瓶颈为止。除非每秒被调用成千上万次,否则不可能发生的事情。这很好,但是将“00000000”这样的全零序列变成空字符串,这可能不是期望的行为。我将第一个修改为while(s.startsWith('0')&&s!=“0”){s.remove(0,1);}
bool ok = false;
QString::number(myString.toLongLong(&ok));