增强的MessageFormat?

Tom*_*ker 4 java

我已经使用MessageFormat.format()了一段时间,但有一件事我觉得很讨厌.

每次在消息中声明参数时,都必须知道映射参数的位置.例如

MessageFormat.format("{0} is annoying {1}.", "this", "indeed")
Run Code Online (Sandbox Code Playgroud)

是否存在与MessageFormat其他方式相同的类,但允许您完全省略参数声明中的参数位置,并将其默认为其在消息中的位置,以便第一个参数映射到第一个参数,第二个参数映射到第二个论点等等?例如

MessageFormat.format("{} is much better{}.", "this", "indeed")
Run Code Online (Sandbox Code Playgroud)

我认为log4j的更高版本具有类似的功能,但我只需要格式化类.

新年快乐!

编辑:我需要这个功能用于断言,所以它真的供内部使用,但我很欣赏你对MessageFormat工作方式的理解.

Chr*_*ung 8

你应该使用Formatter它的前端String.format,而不是.你可以做:

String.format("%s is much better %s", "this", "indeed");
String.format("%1$s provides positional formatting %2$s", "this", "indeed");
Run Code Online (Sandbox Code Playgroud)


seh*_*seh 6

提供您的要求会破坏以下主要目的之一MessageFormat:I18NL10N.也就是说,不同的自然语言可以使用不同的单词顺序来组成"相同"的句子.MessageFormat允许您的代码以设定的顺序强制输入一定数量的参数,然后在为每种语言编写本地化的自然语言字符串时改变插值顺序 - 您可能在适当命名的Java 属性文件中定义了这些字符串.ll加载类ResourceBundle.

典型的工作流程包括首先用您的主要自然语言(例如英语)编写用户可见的消息,然后,对于您希望本地化软件的每种其他语言,定义将这些参数化消息转换为目标语言的并行属性文件,改变输入参数以适应正确的句子结构.

如果您不需要任何此功能,请尝试使用String#format().

  • MessageFormat 确实需要更新:使用 StringBuffers,带格式的索引字段,即使在 Java 10 中也不支持 Java Time API。 (3认同)