Ich hatte ein wenig Probleme damit, als ich versuchte, "reale" Muster mit Internationalisierung usw. zu erstellen. Insbesondere müssen wir ein "Auswahl" -Format verwenden, bei dem die Ausgabe von den angezeigten Werten abhängt, und dafür java.text.ChoiceFormat
ist es gedacht.
Hier ist ein Beispiel, wie dies erreicht werden kann:
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));
}
Dies erzeugt die folgende Ausgabe; Ich hoffe, es ist hilfreich für andere, die versuchen, die gleichen Dinge zu erreichen:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Wie Sie sehen können, können wir im Format "Auswahl" den zu verwendenden Formattyp in Abhängigkeit von dem zu formatierenden Wert auswählen. Kleine Zahlen können durch Text ersetzt werden (keine Anzeige des Originalwerts). Mittelgroße Zahlen werden ohne Gruppentrennzeichen (ohne Kommas) angezeigt. Die größten Zahlen enthalten wieder die Kommas. Offensichtlich ist dies ein völlig erfundenes Beispiel, um die Flexibilität von zu demonstrieren java.text.MessageFormat
.
Ein Hinweis zu dem #
im Format zitierten Text: Da beide ChoiceFormat
und MessageFormat
verwendet werden, kommt es zu einer Kollision zwischen Metazeichen zwischen den beiden. ChoiceFormat
Verwendungen #
als metacharacter , dass im Wesentlichen bedeutet „gleich“ , so dass die Formatierung Motor weiß , dass zum Beispiel im Fall 1#one!
vergleichen wir {0}
mit 1
, und wenn sie gleich sind, verwendet es diese bestimmte „Wahl“.
Aber #
hat eine andere Bedeutung MessageFormat
, und das ist als Metazeichen, das Bedeutung hat für DecimalFormat
: Es ist ein Metazeichen, das bedeutet "hier eine Zahl setzen".
Da es in eine ChoiceFormat
Zeichenfolge eingewickelt ist , #
muss das in Anführungszeichen gesetzt werden. Wenn ChoiceFormat
das Parsen der Zeichenfolge abgeschlossen ist, werden diese Anführungszeichen entfernt, wenn die Unterformate an MessageFormat
(und dann an DecimalFormat
) übergeben werden.
Wenn Sie also verwenden {0,choice,...}
, müssen Sie diese #
und möglicherweise andere Zeichen zitieren .
String.valueOf(long)