Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从QString中删除前导零的最佳方法_C++_Qt_Qt4 - Fatal编程技术网

C++ 从QString中删除前导零的最佳方法

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

你们认为从Q字符串中删除前导零的最好方法是什么

我处理的数字如下:

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));