Лучший способ удалить начальные нули из QString - PullRequest
5 голосов
/ 06 января 2012

Как вы, ребята, думаете, что это лучший способ удалить ведущие нули из QString?

Я имею дело с такими числами, как:

099900000002
008800000031
88800000043

Нужно ли повторятьпо каждому символу, по одному, или есть более элегантный способ, использующий функцию QString :: replace (), о которой я не думал?

Ответы [ 6 ]

10 голосов
/ 06 января 2012

Удалить любое количество нулей в начале строки:

myString.remove( QRegExp("^[0]*") );
5 голосов
/ 06 января 2012

Я посмотрел на QString документ, и нет ни одного, который будет простым и в то же время ясным из того, что вы хотите сделать. Просто напишите так

void removeLeadingzeros(QString &s){

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

 s.remove(0,i);
}
1 голос
/ 06 января 2012

Если под элегантностью вы имеете в виду не повторять себя, то может оказаться полезным тот факт, что контейнеры 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());

Fancy. Но вам лучше повторить себя, как предложил UmNyobe, что быстрее и понятнее.

1 голос
/ 06 января 2012

Я не знаком с QStrings, поэтому я основываюсь на этом std :: string. Возможно, вы можете конвертировать довольно просто?

Если вы можете использовать повышение, то вы можете сделать что-то вроде:

std::string s("000003000000300");
boost::trim_left_if( s, boost::is_any_of("0") );
0 голосов
/ 09 марта 2016

Предполагая, что myString является числом, или вы можете узнать, проверив, является ли ok true

bool ok = false;
QString::number(myString.toLongLong(&ok));
0 голосов
/ 08 марта 2013

Вот элегантная однострочная строка, в которой не используется регулярное выражение:

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

Что очень быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...