【问题标题】:Format a message using MessageFormat.format() in Java在 Java 中使用 MessageFormat.format() 格式化消息
【发布时间】:2013-07-10 11:34:10
【问题描述】:

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

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 一样逃避它,尽管它没有用。需要进行哪些更改才能使其发挥作用?

【问题讨论】:

    标签: java resourcebundle


    【解决方案1】:

    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。 (在双引号解决方案'' 应用之前)

    【讨论】:

    • 有没有其他方法可以做这样的格式但不将单引号转换为双单引号?因为它很烦人。
    • 为什么在 C# 中我不需要这样做?
    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        使用撇号 (Unicode:\u2019)而不是单引号 ' 解决了这个问题,而不会加倍 \'

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 如果不是正则表达式,为什么要replaceAll?只能用替换
            猜你喜欢
            • 1970-01-01
            • 2021-09-01
            • 1970-01-01
            • 2018-05-12
            • 1970-01-01
            • 1970-01-01
            • 2018-11-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多