2014-04-07 5 views
6

Sto cercando di fare una semplice logica con java.text.MessageFormat:Clausola di scelta nidificata 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)); 

Con le parole: Se il primo parametro è maggiore di 1 stampa "ciao", se è superiore a 5 che se il secondo parametro è maggiore di 1 stampa "più di uno" se il secondo parametro è maggiore di 4 stampa "più di quattro".

ho trovato nessuno dicendo che è impossibile, ma ottengo un'IllegalArgumentException:

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

C'è un modo ho potuto fare questo? Grazie!

L'intero 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

si può mettere tutto il tuo stack trace? – BaptisteL

risposta

8

Se si scrive il modello come questo, il ChoiceFormat non può analizzare il formato, perché non può sapere se i caratteri di controllo come il separatore formato (|) sono per l'interno formato o il formato esterno. Ma se si cita il formato che è annidato, si può dire al parser che il testo quotato non contiene caratteri di controllo da analizzare. Lo ChoiceFormat restituirà quindi il testo che contiene un altro pattern ChoiceFormat.

Se la classe MessageFormat applicato un ChoiceFormat analizza il risultato nuovamente come MessageFormat per gestire l'elaborazione parametro aggiuntivo, che poi gestisce l'interno ChoiceFormat.

Così il codice funziona se si scrive il modello in questo modo:

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

Funziona. Grazie mille! – user2424380