2014-04-07 58 views
6

Próbuję zrobić prostą logikę z java.text.MessageFormat:Zagnieżdżona klauzula wyboru w 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)); 

ze słowami: Jeśli pierwszy parametr jest większa niż 1 pisz „cześć”, jeśli jest ona większa niż 5, niż gdyby drugi parametr jest większy niż 1 "więcej niż jeden", jeśli drugi parametr jest większy niż 4 "więcej niż cztery".

znalazłem nikogo, mówiąc, że to jest niemożliwe, ale mam IllegalArgumentException:

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

czy istnieje sposób mogę to zrobić? Dzięki!

Cały 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

można umieścić cały swój ślad stosu? – BaptisteL

Odpowiedz

8

Jeśli piszesz wzór podobnego tego, ChoiceFormat nie można analizować format, ponieważ nie może wiedzieć, czy znaki sterujące, takie jak separator Format (|) są dla wewnętrzna format lub format zewnętrzny. Ale jeśli zacytujesz zagnieżdżony format, możesz powiedzieć analizatorowi, że cytowany tekst nie zawiera żadnych znaków kontrolnych, które powinien przeanalizować. ChoiceFormat następnie po prostu zwróci tekst zawierający inny wzór ChoiceFormat.

Jeśli klasa MessageFormat zastosował ChoiceFormat analizuje wynik ponownie w MessageFormat do obsługi dodatkowego przetwarzania parametru, który następnie przetwarza wewnętrzna ChoiceFormat.

Więc kod działa, jeśli piszesz wzór takiego:

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

To działa. Dziękuję Ci bardzo! – user2424380