2014-04-07 60 views
6

我試圖做一個簡單的邏輯與java.text.MessageFormat中: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頁的打印「你好」,如果大於5比如果如果第二個參數大於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 
+0

你可以把你整個堆棧跟蹤:

所以,如果你寫這樣的模式代碼工作? – BaptisteL

回答

8

如果你寫這樣的模式,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)); 
+0

它的工作原理。非常感謝你! – user2424380