84

我在资源包中存储了一些消息。我正在尝试按如下方式格式化这些消息。

import java.text.MessageFormat;

String text = MessageFormat.format("You're about to delete {0} rows.", 5);
System.out.println(text);

假设第一个参数,即实际消息存储在以某种方式检索的属性文件中。

第二个参数,即 5 是一个动态值,应该放在{0}不会发生的占位符中。下一行打印,

您即将删除 {0} 行。

占位符不替换为实际参数。


它是这里的撇号 - You're。我试图像往常一样逃避它,You\\'re尽管它没有用。需要进行哪些更改才能使其发挥作用?

4

6 回答 6

135

'MessageFormat图案添加额外的撇号String以确保'显示字符

String text = 
     java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
                                         ^

MessageFormat 模式中的撇号(又名单引号)以带引号的字符串开头,并且不会自行解释。来自javadoc

单引号本身必须在整个字符串中用双引号 '' 表示。

TheString You\\'re相当于在 the 中添加一个反斜杠字符,String因此唯一的区别You\re是生成的不是Youre. (在应用双引号解决方案之前''

于 2013-07-10T11:36:01.460 回答
12

只要确保您使用了双撇号 ('')

String text = java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
System.out.println(text);

编辑:

在字符串中,一对单引号可用于引用除单引号之外的任意字符。例如,模式字符串“'{0}'”表示字符串“{0}”,而不是 FormatElement。...

任何不匹配的引号在给定模式的末尾都被视为关闭。例如,模式字符串“ ' {0}”被视为模式“ ' {0} ' ”。

来源http://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html

于 2013-07-10T12:02:09.647 回答
6

您需要在“You''re”中使用双撇号而不是单撇号,例如:

String text = java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
System.out.println(text);
于 2013-07-10T11:38:02.953 回答
4
于 2017-12-14T16:47:30.913 回答
3

对于在 string.xml 中有 Android 问题的每个人,请使用 \'\' 而不是单引号。

于 2014-07-30T09:49:40.137 回答
0

这是一种不需要编辑代码并且无论字符数如何都可以工作的方法。

String text = 
  java.text.MessageFormat.format(
    "You're about to delete {0} rows.".replaceAll("'", "''"), 5);
于 2020-10-16T05:39:20.187 回答