I’m trying to do a simple logic with 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));
With words: If the first parameter is greater then 1 print “hello”, if it is greater than 5 than if the second parameter is greater than 1 print “more than one” if the second parameter is greater than 4 print “more than four”.
I found no one saying it is impossible but I get an IllegalArgumentException:
Choice Pattern incorrect: 1<hello|5<{1,choice,1<more than one|4<more than four}
Is there a way I could do this? Thanks!
The whole stacktrace:
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
Advertisement
Answer
If you write the pattern like this, the ChoiceFormat
can not parse the format, because it can not know if control characters like the format separator (|
) are for the inner format or the outer format. But if you quote the format that is nested you can tell the parser that the quoted text does not contain any control characters it should parse. The ChoiceFormat
will then just return the text that contains another ChoiceFormat
pattern.
If the MessageFormat
class applied a ChoiceFormat
it parses the result again as a MessageFormat
to handle additional parameter processing, which then handles the inner ChoiceFormat
.
So the code works if you write the pattern like this:
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));