格式字符串 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 有问题。很高兴它对你有用 顺便说一句,如果您在字符串中使用 (用于翻译字符串的标记),您将收到相同的错误消息 【参考方案1】:

我刚刚复制了代码,它运行良好。 所以你可能需要检查其他地方,这是我的建议。

    清理项目 检查多语言文件 或者只是像其他人说的那样使用 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 -&gt; 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 的特殊字符

发件人&lt;string name="XXX"&gt;% %1$s&lt;/string&gt;

收件人&lt;string name="XXX"&gt;%1$s&lt;/string&gt;

最后 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的主要内容,如果未能解决你的问题,请参考以下文章

使用数字格式检查给定字符串是不是为有效货币

SSN和电话号码的正则表达式[关闭]

mybatis在传参时,为啥#能够有效的防止sql注入

如何在 Delphi 中将浮点数转换为字符串,指定有效数字,而不是十进制数字(而不是 G 格式)

将字符串转换为 JSON 有效格式

在 android 中收到的 FCM 数据有效负载不是 json 格式