【问题标题】:How to deal with "%1" in the argument of QString::arg()?QString::arg()的参数中的“%1”如何处理?
【发布时间】:2011-07-12 02:22:38
【问题描述】:

每个人都喜欢

QString("Put something here %1 and here %2")
    .arg(replacement1)
    .arg(replacement2);

但是一旦你有最微弱的机会replacement1实际上在任何地方包含%1甚至%2,事情就会变得很痒。然后,第二个 QString::arg() 将仅替换重新引入的 %1 或两个 %2 出现。无论如何,你不会得到你可能想要的文字 "%1"

有什么标准技巧可以克服这个问题吗?

如果你需要一个例子来玩,就拿这个

#include <QCoreApplication>
#include <QDebug>

int main()
{
    qDebug() << QString("%1-%2").arg("%1").arg("foo");
    return 0;
}

这将输出

"foo-%2"

而不是

"%1-foo"

正如预期的那样(不是)。

    qDebug() << QString("%1-%2").arg("%2").arg("foo");

给予

"foo-foo"

    qDebug() << QString("%1-%2").arg("%3").arg("foo");

给予

"%3-foo"

【问题讨论】:

  • 我知道,我可以使用 operator + () 进行字符串连接,但在某些地方,例如使用tr() 进行翻译,希望保留对模板中的参数重新排序的能力。
  • 哇!我从未遇到过这种情况,但如果翻译是字符串“%1”(例如,与 1% 相对),那么它根本无法正常工作。这真的没有意义。看起来他们一遍又一遍地将参数重新应用于结果。
  • 不是有可能通过写“%%1”来伪转义“%1”吗?在 arg 调用中使用百分比标记的功能仍然很好。想象一下,您有一个标准错误字符串,使用%1 替换“where”和%2 替换“what” - 现在在某些情况下您只需将“where”替换为字符串,在其他情况下您想要一个数字.如果是字符串,您可能希望在其周围加上撇号,如果是数字,则前面的主题标签会很好地提高可读性。现在您可以使用第一个 arg-call 将 %1 替换为 f.e. "#%3" 和第三次 arg 调用以插入号码。

标签: qt string-formatting placeholder qstring


【解决方案1】:

请参阅有关 QString::arg() 的 Qt 文档:

QString str;
str = "%1 %2";
str.arg("%1f", "Hello"); // returns "%1f Hello"

【讨论】:

  • 好的,谢谢!以及如何处理需要QString::arg() 的不同重载的情况,例如数字呢?在 multi-QString-arg() 中使用 QString::number() 不是一回事,因为它不能让您指定字段宽度。
  • 好的,我可以使用QString::leftJustified()QString::rightJustified(),但这会变得冗长。我认为拥有arg() 的自动转义版本会很棒。
  • @Johnny, QString("%1-%2").arg("%1").arg(23, 8, 10, QChar('0')); 将使用QString("00000023-%2") 而不是QString("%1-00000023")
  • @Tilman,您对此有何看法: QString("%1-%2").arg("%1", QString("%1").arg(23, 8, 10、QChar('0'))); ?
  • @Johnny,是的,并不完全糟糕 ;-) 仍然可悲,它在最初的优雅中不起作用......一种方法是在替换中逃避所有 % 并在arg() 淋浴已停止,使用了一些中间字符串模板类。感谢您的想法!
【解决方案2】:

请注意,多个参数的 arg() 重载仅采用 QString。如果不是所有参数都是 QStrings,您可以更改格式字符串中占位符的顺序:

QString("1%1 2%2 3%3 4%4").arg(int1).arg(string2).arg(string3).arg(int4);

变成

QString("1%1 2%3 3%4 4%2").arg(int1).arg(int4).arg(string2, string3);

这样,所有不是字符串的都先替换,然后所有字符串同时替换。

【讨论】:

    【解决方案3】:

    你应该尝试使用

    QString("%1-%2").arg("%2","foo");
    

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 2013-12-20
      • 1970-01-01
      • 2013-05-20
      • 2017-07-19
      • 2012-06-04
      • 2016-06-01
      • 1970-01-01
      • 2019-12-18
      相关资源
      最近更新 更多