在string.xml中使用带有%符号的占位符来配合String.format()函数

10

我正在string.xml文件中使用占位符%1$d表示int类型的值,然后我想在同一个TextView中显示百分号%,所以它是%。我像这样使用它。

<string name="uploadProgress">%1$d&#37;<string>

现在在Java代码中,我像这样使用它。

int progress = 10;
textView.setText(String.format(getString(R.string.uploadProgress), progress));

但它显示:

java.util.UnknownFormatConversionException: 转换:

我尝试了以下方法:

  1. %替换&#37;
  2. %1$d&#37;之间加入一个空格(但实际上我不想要空格)

但是没有成功。我该如何解决这个问题?我已经查看了其他类似的 SO 问题以寻找解决方案,但我没有找到特定的解决方案。


你试过在&#37;的位置使用\u0025吗? - Phantômaxx
2
Android不使用&#语法。就像Bob所说,使用\u。 - Gabe Sechan
还要查看getString(int, Object...) - tynn
2个回答

20

我也遇到过这个问题。在XML字符串资源中,有两种方法可以转义百分号。

对于你的情况(带参数的字符串,例如%1$d),应该使用%%来转义百分号字面量。

如果你的字符串没有参数,则应该使用\u0025来转义百分号字面量。

如果你在没有参数的字符串中使用%%,那么getString()将把它解析为字面量%%而不是转义它。如果你在一个带参数的字符串中使用\u0025,那么getString()将尝试将该%作为格式参数处理,从而导致崩溃。


2
如果您的字符串资源没有参数,则可以使用formatted="false"属性。
在您的情况下,您需要使用双百分号(%%)。

2
我只能给你点赞,你的回答是绝对正确的。但是@kcoppock给出的答案更加具体和详细,这可以帮助其他人在未来也能够受益,并且也能够实现SO的目标。感谢你给出正确的答案。 - GreenROBO
这很公平。 :) - Michael Spitsin

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