在Java中使用MessageFormat.format()格式化消息


72

我已经在资源束中存储了一些消息。我正在尝试按以下格式设置这些消息。

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尽管它没有用。需要进行哪些更改才能使其正常工作?

Answers:


122

'MessageFormat模式中添加多余的撇号以String确保'显示字符

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

MessageFormat模式中的撇号(也称为单引号)以引号引起来的字符串开头,并且不能自行解释。从javadoc

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

String You\\'re等效于将一个反斜线字符到String所以唯一的区别是You\re将产生,而不是Youre。(在应用双引号解决方案之前''


是否有其他方法可以执行这种格式,但不能将单引号转换为双单引号?因为这很烦人。
Mostafa Vatanpour '18

为什么在C#中我不需要这样做?
Alex78191 '19

10

只要确定您已使用双撇号('')

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


6

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

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


2

使用撇号(Unicode :)\u2019而不是单引号可以'解决此问题,而不必加倍\'


0

这是一种无需编辑代码即可使用的方法,而与字符数无关。

String text = 
  java.text.MessageFormat.format(
    "You're about to delete {0} rows.".replaceAll("'", "''"), 5);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.