我正在尝试使用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));