Ho lottato un po 'con questo quando ho provato a creare modelli "del mondo reale" con l'internazionalizzazione, ecc. Nello specifico, abbiamo bisogno di utilizzare un formato "a scelta" in cui l'output dipende dai valori visualizzati, ed è a questo che java.text.ChoiceFormat
serve.
Ecco un esempio su come ottenere questo risultato:
MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");
int[] nums = new int[] {
0,
1,
100,
1000,
10000,
100000,
1000000,
10000000
};
Object[] a = new Object[1];
for(int num : nums) {
a[0] = num;
System.out.println(fmt.format(a));
}
Questo genera il seguente output; Spero che sia utile per gli altri che stanno cercando di realizzare gli stessi tipi di cose:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Come puoi vedere, il formato "scelta" ci permette di scegliere il tipo di formato da utilizzare a seconda del valore che viene passato per essere formattato. I numeri piccoli possono essere sostituiti con testo (nessuna visualizzazione del valore originale). I numeri di medie dimensioni vengono visualizzati senza separatori di raggruppamento (senza virgole). I numeri più grandi includono le virgole, ancora una volta. Ovviamente, questo è un esempio del tutto artificioso per dimostrare la flessibilità di java.text.MessageFormat
.
Una nota sul citato #
nel testo in formato: poiché vengono utilizzati entrambi ChoiceFormat
e MessageFormat
, c'è una collisione tra i metacaratteri tra i due. ChoiceFormat
usi #
come metacarattere che essenzialmente significa "uguale" in modo che il motore di formattazione sa che ad esempio nel caso di 1#one!
stiamo confrontando {0}
con 1
, e se sono uguali, esso utilizza quella particolare "scelta".
Ma #
ha un altro significato MessageFormat
, ed è come un metacarattere che ha un significato per DecimalFormat
: è un metacarattere che significa "metti un numero qui".
Poiché è racchiuso in una ChoiceFormat
stringa, il valore #
deve essere citato. Al ChoiceFormat
termine dell'analisi della stringa, tali virgolette vengono rimosse quando si passano i sottoformati a MessageFormat
(e quindi a DecimalFormat
).
Quindi, quando lo usi {0,choice,...}
, devi citare quei #
personaggi e possibilmente altri.
String.valueOf(long)