Решение неоднозначности QString arg() QT
существует проблема с использованием QString::arg()
когда строка содержит цифру сразу после маркера места. Это не ясно из QString::arg()
описание функции, что произойдет в случае такой замены:
QString("String for replacement %1234").arg("blah");
приведет ли это к "String for replacement blah234"
или "String for replacement blah34"
?
Я посмотрел в исходном коде QT, чтобы ответить на этот вопрос. Кажется, что алгоритм, который ищет маркеры места, "жадный", и он возьмет обе цифры в приведенном выше примере.
здесь источник функции QT, которая используется внутри QString::arg()
(QT 4.8.4):
static ArgEscapeData findArgEscapes(const QString &s)
{
const QChar *uc_begin = s.unicode();
const QChar *uc_end = uc_begin + s.length();
ArgEscapeData d;
d.min_escape = INT_MAX;
d.occurrences = 0;
d.escape_len = 0;
d.locale_occurrences = 0;
const QChar *c = uc_begin;
while (c != uc_end) {
while (c != uc_end && c->unicode() != '%')
++c;
if (c == uc_end)
break;
const QChar *escape_start = c;
if (++c == uc_end)
break;
bool locale_arg = false;
if (c->unicode() == 'L') {
locale_arg = true;
if (++c == uc_end)
break;
}
if (c->digitValue() == -1)
continue;
int escape = c->digitValue();
++c;
if (c != uc_end && c->digitValue() != -1) {
escape = (10 * escape) + c->digitValue();
++c;
}
if (escape > d.min_escape)
continue;
if (escape < d.min_escape) {
d.min_escape = escape;
d.occurrences = 0;
d.escape_len = 0;
d.locale_occurrences = 0;
}
++d.occurrences;
if (locale_arg)
++d.locale_occurrences;
d.escape_len += c - escape_start;
}
return d;
}
есть ли лучший способ решения такой неоднозначности, чем всегда использовать 2-значные маркеры места?
3 ответов
так как вы можете только использовать %1
to %99
в качестве маркеров, и вы можете пропустить номера маркеров вы можете написать:
QString("String for replacement %10234").arg("blah");
для вывода строки для замены blah234
состояния справки Qt для arg (const QString & a, int fieldWidth = 0, QChar fillChar = QLatin1Char (''))
возвращает копию этой строки с наименьшим нумерованным маркером места, замененным строкой a, т. е. %1, %2,..., %99.
...
номера маркеров должны находиться в диапазоне от 1 до 99.
поэтому то, что вы видите, по определению правильно; первые два числа будут заместить. Если вы хотите "строку для замены blah234", то вы можете определить строку как: -
QString("String for replacement %1%2").arg("blah").arg(234);
у меня такая же проблема, но ответы на заказ не выглядят для меня хорошим способом.
Я разрешаю двусмысленность таким образом.
QString myString= QString("ConcatenatedNumbers%0123").arg(66,3,10, QChar('0'));
эта строка:
ConcatenatedNumbers06623