2014-04-07 6 views
6

Ich versuche, eine einfache Logik mit java.text.MessageFormat zu tun:Verschachtelte Auswahlklausel in 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)); 

Mit Worten: Wenn der erste Parameter größer als 1 print „Hallo“ ist, wenn es größer als 5, als wenn das ist zweiter Parameter ist größer als 1 "mehr als eins" drucken, wenn der zweite Parameter größer als 4 ist "mehr als vier drucken".

fand ich niemand sagen, es ist unmöglich, aber ich erhalte eine Illegal:

Choice Pattern incorrect: 1<hello|5<{1,choice,1<more than one|4<more than four}

Gibt es eine Weise, die ich dies tun könnte? Vielen Dank!

Die ganze 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 
+0

Können Sie Ihre gesamte Stack-Trace setzen? – BaptisteL

Antwort

8

Wenn Sie das Muster so schreiben, kann die ChoiceFormat nicht das Format analysieren, weil es nicht wissen kann, ob Steuerzeichen wie das Format Separator (|) sind für die inneren Format oder das äußere Format. Wenn Sie jedoch das verschachtelte Format angeben, können Sie dem Parser mitteilen, dass der zitierte Text keine Steuerzeichen enthält, die analysiert werden sollten. Die ChoiceFormat wird dann nur den Text zurückgeben, der ein weiteres ChoiceFormat Muster enthält.

Wenn die Klasse ein MessageFormatChoiceFormat angewandt parst sie das Ergebnis wieder als zusätzliche Parameter MessageFormat Verarbeitung zu handhaben, die dann die inneren ChoiceFormat abwickelt.

So funktioniert der Code, wenn Sie das Muster wie folgt schreiben:

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)); 
+0

Es funktioniert. Vielen Dank! – user2424380

Verwandte Themen