Browse Source

Merge pull request #10721 from Chocobo1/sort

Fix wrong comparison result
adaptive-webui-19844
Mike Tzou 6 years ago committed by GitHub
parent
commit
db88c2d6a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      src/base/utils/string.cpp

21
src/base/utils/string.cpp

@ -96,18 +96,29 @@ namespace
} }
else if (leftChar.isDigit() && rightChar.isDigit()) { else if (leftChar.isDigit() && rightChar.isDigit()) {
// Both are digits, compare the numbers // Both are digits, compare the numbers
const auto consumeNumber = [](const QString &str, int &pos) -> int
const auto numberView = [](const QString &str, int &pos) -> QStringRef
{ {
const int start = pos; const int start = pos;
while ((pos < str.size()) && str[pos].isDigit()) while ((pos < str.size()) && str[pos].isDigit())
++pos; ++pos;
return str.midRef(start, (pos - start)).toInt(); return str.midRef(start, (pos - start));
}; };
const int numL = consumeNumber(left, posL); const QStringRef numViewL = numberView(left, posL);
const int numR = consumeNumber(right, posR); const QStringRef numViewR = numberView(right, posR);
if (numViewL.length() != numViewR.length())
return (numViewL.length() - numViewR.length());
// both string/view has the same length
for (int i = 0; i < numViewL.length(); ++i) {
const QChar numL = numViewL[i];
const QChar numR = numViewR[i];
if (numL != numR) if (numL != numR)
return (numL - numR); return (numL.unicode() - numR.unicode());
}
// String + digits do match and we haven't hit the end of both strings // String + digits do match and we haven't hit the end of both strings
// then continue to consume the remainings // then continue to consume the remainings

Loading…
Cancel
Save