格式字符串 XXX 不是有效的格式字符串,因此不应将其传递给 String.format
Posted
技术标签:
【中文标题】格式字符串 XXX 不是有效的格式字符串,因此不应将其传递给 String.format【英文标题】:Format string XXX is not a valid format string so it should not be passed to String.format 【发布时间】:2017-04-07 13:07:27 【问题描述】:我在资源中有安卓应用和这个字符串:
<string name="create_group_select_people">Select up to %1$d people!</string>
这是从片段中调用的:
Integer countMax = 5; //also tried just "int" - nothing changed
getResources().getString(R.string.create_group_select_people, countMax);
但我得到了错误:
Format string 'create_group_select_people' is not a valid format string so it should not be passed to String.format
我不明白出了什么问题?当我启动应用程序时,它会按字面意思显示“最多选择 %1$d 人!”
【问题讨论】:
与“create_group_select_people”有任何名称冲突吗?字符串看起来合法 Borys,项目中没有名称冲突 是的,我猜想 IDE 有问题。很高兴它对你有用 顺便说一句,如果您在字符串中使用我刚刚复制了代码,它运行良好。 所以你可能需要检查其他地方,这是我的建议。
-
清理项目
检查多语言文件
或者只是像其他人说的那样使用 String.format
【讨论】:
干净的构建对我有用。为什么你知道这项工作?一开始出了什么问题。 2 号为我做了。起初我认为 lint 有问题,因为我看到了 3 次相同的警告,但事实证明,如果字符串格式不正确,每种语言都有一个警告 我不确定其他人,但对我来说,百分比(%)符号存在问题,可能与 Unicode 有关。应该有一个小符号 (compart.com/en/unicode/U+FE6A) 而不是大符号 (compart.com/en/unicode/U+0025)。希望这会有所帮助:) 对我来说,我需要检查选项 2:检查多语言文件 如果你有一个百分号,你需要将它转义为%%
。您不需要像@Chitrang 建议的那样使用不寻常的 Unicode 百分比变体,如果这样做,您可能会发现某些字体中缺少它。【参考方案2】:
在资源中设置参数格式为true:
<string name="some_text" formatted="true">
Use for String.format method. Parameter one: %s1
</string>
并以这种方式使用:
String.format(context.getString(R.string.some_text,"value 1"))
或者这样:
context.getString(R.string.some_text,"value 1"))
注意:formatted flag 应该只对带有占位符的字符串设置为 true
【讨论】:
这是为我做的。出于某种原因,我需要重新启动 android Studio 以删除错误消息。【参考方案3】:如果您在多个字符串文件(翻译)中具有相同的字符串,但其中一个没有正确的格式,例如缺少“%s”或“%1$s”,将显示此错误,将使用将传递的参数(例如:“countMax”)放在下面的行中。
getResources().getString(R.string.create_group_select_people, countMax)
所以,在您尝试上述任何其他答案之前,请先检查一下。
【讨论】:
有时候别人忘了第二个参数是什么意思 成功了,谢谢:)【参考方案4】:试试File -> Invalidate Caches / Restart...
,它为我解决了问题。
【讨论】:
【参考方案5】:为了其他可能会发现此线程的人,此警告的一个可能原因是您在字符串资源文件中定义了多种语言,并且您没有在其中一个或多个中指定格式参数。
例如,如果您的 values 文件夹中有一个 strings.xml,而您的 values-es 文件夹中有另一个 strings.xml,但您只在 values 文件夹中的 strings.xml 中添加了格式参数,则警告将由于 values-es 文件夹中 strings.xml 的字符串资源中缺少格式参数而被触发。
【讨论】:
【参考方案6】:您需要字符串格式化程序。请从以下代码更改
getResources().getString(R.string.create_group_select_people, countMax);
到
String temp = String.format(getResources().getString(R.string.create_group_select_people), countMax);
更多详情refer
【讨论】:
【参考方案7】:尝试做一个“干净的项目”,然后关闭并重新打开 Android Studio。
这为我修复了它,它看起来像一些小的 Android Studio /Lint 错误。
【讨论】:
【参考方案8】:你可能缺少String类的格式方法,如果你在TextView中设置它,正确的方法是:
textView.setText(String.format(getResources().getString(R.string.create_group_select_people), countMax));
【讨论】:
【参考方案9】:创建一个函数并将您的代码放入其中并在函数之前添加此@SuppressLint("StringFormatInvalid")
。希望对您有所帮助。
【讨论】:
【参考方案10】:为了使字符串的格式正确:
String.format(Locale.ENGLISH, itemView.context.getString(R.string.XXX), "%17")
另外特殊字符也不必干扰参数的注入。为此,请考虑 exhaust outlets 的特殊字符
发件人:<string name="XXX">% %1$s</string>
收件人:<string name="XXX">%1$s</string>
最后 XXX 是“%17”
祝你好运。
Source
【讨论】:
【参考方案11】:在我的情况下,通过重启使缓存无效并没有帮助,但是在其他语言环境中使用一致的格式参数(例如 %s
)解决了这个问题。我希望这可能对将来的某人有所帮助。
【讨论】:
【参考方案12】:我有同样的问题,但它有不同的起源。我的应用程序有一些语言,在一个翻译中没有“%”而是一个“$”符号。它仍然有效,除了使用这种特定的语言,如果我使用了字符串,我在相应的行收到了这个提示。
【讨论】:
【参考方案13】:如果它显示红色错误,然后像这样添加字符串值,它将起作用。
如果要字符串格式:
<string name="msg_token_fmt" formatted="true"> %s
</string>
如果你想要float格式float:
<string name="msg_token_fmt" formatted="true"> %f
</string>
如果要数字格式:
<string name="msg_token_fmt" formatted="true"> %d
</string>
【讨论】:
以上是关于格式字符串 XXX 不是有效的格式字符串,因此不应将其传递给 String.format的主要内容,如果未能解决你的问题,请参考以下文章