我正在尝试使用java.text.MessageFormat做一个简单的逻辑:

MessageFormat cf = new MessageFormat(
"{0,choice, 1<hello|5<{1,choice,1<more than one|4<more than four}}");

 Object[] array = {3, 1};
 System.out.println(cf.format(array));

带有单词:如果第一个参数大于1,则打印“hello”,如果大于5,则比第二个参数大于1时打印“大于一个”;如果第二个参数大于4,则打印“大于1” ”。

我没有发现有人说这是不可能的,但是却收到了IllegalArgumentException:
Choice Pattern incorrect: 1<hello|5<{1,choice,1<more than one|4<more than four}
有办法吗?谢谢!

整个堆栈跟踪:
Exception in thread "main" java.lang.IllegalArgumentException: Choice Pattern incorrect:  1<hello|5<{1,choice,1<more than one|4<more than four}
at java.text.MessageFormat.makeFormat(Unknown Source)
at java.text.MessageFormat.applyPattern(Unknown Source)
at java.text.MessageFormat.<init>(Unknown Source)
at test.Test5.main(Test5.java:18)
Caused by: java.lang.IllegalArgumentException
    at java.text.ChoiceFormat.applyPattern(Unknown Source)
    at java.text.ChoiceFormat.<init>(Unknown Source)
    ... 4 more

最佳答案

如果以这种方式编写模式,则ChoiceFormat无法解析格式,因为它不知道诸如格式分隔符(|)之类的控制字符是用于内部格式还是用于外部格式。但是,如果引用嵌套的格式,则可以告诉解析器引用的文本不包含应解析的任何控制字符。然后,ChoiceFormat将仅返回包含另一个ChoiceFormat模式的文本。

如果MessageFormat类应用了ChoiceFormat,它将再次将结果解析为MessageFormat来处理其他参数处理,然后再处理内部ChoiceFormat

因此,如果您编写这样的模式,则代码可以正常工作:

MessageFormat cf = new MessageFormat(
    "{0,choice, 1<hello|5<'{1,choice,1<more than one|4<more than four}'}");

Object[] array = {3, 1};
System.out.println(cf.format(array));

10-08 04:46