【问题标题】:Best way to remove leading zeros from a QString从 QString 中删除前导零的最佳方法
【发布时间】:2012-01-06 15:32:12
【问题描述】:

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

我正在处理这样的数字:

099900000002
008800000031
88800000043

我是否必须一次一个地遍历每个字符,或者是否有一种更优雅的方式使用我没有想到的 QString::replace() 函数?

【问题讨论】:

  • 您必须直接或间接地遍历字符串。

标签: c++ qt qt4


【解决方案1】:

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

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

【讨论】:

  • 谢谢克里斯!我仍然不确定为什么有些人认为这是“完全矫枉过正”,但我选择这个作为我的答案,我会使用它。
  • myString.remove( QRegExp("^[0]*") ); 首先你构造一个QString,然后是一个QRegExp。然后你进行匹配,这在计算上至少和我的removeLeadingzeros一样复杂。
  • 我养成了在衡量性能之前不谈论性能的习惯。我做了一些基准测试,在我的机器上,RegEx 版本每次迭代大约需要 0.012 毫秒,而您的 removeLeadingZeros 版本每次迭代大约需要 0.00034 毫秒。虽然它肯定更快,但我认为 RegEx 的简单性和可读性超过了其他函数的速度带来的好处,直到它成为瓶颈。除非每秒被调用数千次,否则不太可能发生的事情。
【解决方案2】:

我查看了QString 文档,没有一个简单且明确说明您想要做什么的文档。就这样写

void removeLeadingzeros(QString &s){

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

 s.remove(0,i);
}

【讨论】:

  • 太糟糕了 QString 没有提供类似 basic_string::find_first_not_of() 的东西。
  • 你为什么要用正则表达式来做这么简单的事情,性能就是你写 c++ 的原因吗? +1 这个答案。 Shame QString 没有可以输入字符的修剪功能。
【解决方案3】:

我不熟悉 QStrings,所以我基于 std::string。也许你可以很简单地转换?

如果您可以使用 boost,那么您可以执行以下操作:

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

【讨论】:

    【解决方案4】:

    如果优雅是指不迭代自己,那么 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 的建议迭代自己,这样更快更清晰。

    【讨论】:

      【解决方案5】:

      这是一个不使用正则表达式的优雅单行:

      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') &amp;&amp; s != "0") { s.remove(0,1); }
      【解决方案6】:

      QString mystring = "00000545465651";

      我的字符串 = QString::number(mystring.toInt());

      // 结果 = mystring = "545465651";

      通过将QString 转换为整数,将删除前导零。 比你把它转换回QString

      【讨论】:

        【解决方案7】:

        假设myString是一个数字,或者你可以通过检查ok是否是true来找出答案

        bool ok = false;
        QString::number(myString.toLongLong(&ok));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-16
          • 2017-03-17
          • 1970-01-01
          • 1970-01-01
          • 2019-01-23
          • 2021-05-21
          • 2011-04-09
          相关资源
          最近更新 更多