这个格式字符串有什么问题?

16

我有一个这样的字符串:

<string name="q_title" formatted="false">Item %d of %d</string>
我将其用在String.format中,如下所示:
String log = String.format(getString(R.string.q_title), 100, 500);

到目前为止,我观察到输出没有问题。

但是,在Android Studio中进行代码检查时,我收到了以下警告:

格式字符串“q_title”不是有效的格式字符串,因此不应传递给String.format

为什么会这样呢?


请点击此处查看:http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling - Blackbelt
1
你能否更新你的问题,添加新的字符串? - Blackbelt
@blackbelt 嘿,不知何故他们还没有将其集成到Android Studio中。我不是评判者,但他们在处理Android Studio的业务方式很奇怪。如果您愿意,我可以接受那个答案。 - Alexander Kulyakhtin
有些人说在ADT 21上已经修复了这个问题。然而,我使用的是ADT 22,仍然看到这种奇怪的行为,并且需要对每个带有“%”的字符串标签使用formatted="false"。 - android developer
1
顺便提一下,如果您在字符串中使用xliff:g(用于翻译字符串的标签),则会收到相同的错误消息。 - Daniel
显示剩余3条评论
5个回答

27

您的字符串应该是

<string name="q_title" formatted="false">Item %1$d of %2$d</string>

和代码

String log = getString(R.string.q_title, 100, 500);

当你有多个参数时,你需要用1 $、2 $…… n $标记它们。在阿拉伯语中,顺序是相反的,因此他们需要知道如何正确更改它。

getString(id,args ...)会自行执行格式化。


10
对于百分比,以下方法对我有效。
<string name="score_percent">%s%%</string>


getString(R.string.score_percent,"20")

如果您正在处理整数,请将 s 替换为 d。

<string name="score_percent">%d%%</string>

2
如果您需要格式化字符串,可以将格式参数放在字符串资源中,如下面示例资源所示。
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

在这个例子中,格式字符串有两个参数:%1$s是一个字符串,%2$d是一个十进制数。然后,通过调用getString(int, Object...)来格式化字符串。例如:

String text = getString(R.string.welcome_messages, username, mailCount);

2

对于那些仍在寻找答案的人,正如Blackbelt发布的链接所示,字符串的正确格式应该是:

<string name="q_title">Item %1$d of %2$d</string>

1

注意转义所有特殊字符。

我遇到了一个问题,因为我忘记转义字符串末尾的百分号“%”。

<string name="market_variation_formatter">%s %</string> 

好的转义字符串是:

<string name="market_variation_formatter">%s \%</string>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接