当字符串在地点标记之后包含数字时,使用QString::arg()
会出现问题。从QString::arg()
函数描述中不清楚在这种替换的情况下会发生什么:
QString("String for replacement %1234").arg("blah");
这会导致"String for replacement blah234"
或"String for replacement blah34"
吗?
我查看了QT的源代码来回答这个问题。看起来寻找位置标记的算法似乎是“贪婪的”,并且在上面的例子中它将采用两个数字。
以下是QString::arg()
(QT 4.8.4)中使用的QT函数的来源:
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位数字位置标记更好的解决这种模糊性的方法?
答案 0 :(得分:3)
Qt帮助指出arg(const QString&amp; a,int fieldWidth = 0,QChar fillChar = QLatin1Char(''))
返回此字符串的副本,其中编号最小的地方标记替换为字符串a,即%1,%2,...,%99。
...
放置标记号必须在1到99之间。
因此,根据定义,您所看到的是正确的;前两个数字将被替换。如果您想要“String for replacement blah234”,那么您可以将字符串定义为: -
QString("String for replacement %1%2").arg("blah").arg(234);
答案 1 :(得分:2)
由于您只能使用%1
至%99
作为标记,因此您可以跳过标记编号:
QString("String for replacement %10234").arg("blah");
输出字符串以替换blah234
答案 2 :(得分:0)
我有同样的问题,但订单回答对我来说不是一个好方法。
我已经用这种方式解决了歧义。
QString myString= QString("ConcatenatedNumbers%0123").arg(66,3,10, QChar('0'));
字符串将是:
ConcatenatedNumbers06623