J'ai eu un peu de mal avec cela en essayant de faire des modèles «du monde réel» avec l'internationalisation, etc. Plus précisément, nous avons besoin d'utiliser un format de «choix» où la sortie dépend des valeurs affichées, et c'est à cela que java.text.ChoiceFormat
sert.
Voici un exemple pour y parvenir:
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));
}
Cela génère la sortie suivante; J'espère que cela sera utile pour les autres qui essaient d'accomplir les mêmes types de choses:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Comme vous pouvez le voir, le format "choix" nous permet de choisir le type de format à utiliser en fonction de la valeur transmise à formater. Les petits nombres peuvent être remplacés par du texte (pas d'affichage de la valeur d'origine). Les nombres de taille moyenne sont affichés sans séparateurs de regroupement (sans virgules). Les plus grands nombres incluent à nouveau les virgules. De toute évidence, il s'agit d'un exemple entièrement artificiel pour démontrer la flexibilité de java.text.MessageFormat
.
Une note à propos de la citation #
dans le format texte: puisque les deux ChoiceFormat
et MessageFormat
sont utilisés, il y a une collision entre les métacaractères entre les deux. ChoiceFormat
utilise #
comme métacaractère qui signifie essentiellement "égal" pour que le moteur de formatage sache que, par exemple, dans le cas où 1#one!
nous comparons {0}
avec 1
, et s'ils sont égaux, il utilise ce "choix" particulier.
Mais #
a une autre signification MessageFormat
, et c'est comme un métacaractère qui a un sens pour DecimalFormat
: c'est un métacaractère qui signifie "mettre un nombre ici".
Parce qu'il est enveloppé dans une ChoiceFormat
chaîne, le #
doit être entre guillemets. Lorsque l' ChoiceFormat
analyse de la chaîne est terminée, ces guillemets sont supprimés lors du passage des sous-formats à MessageFormat
(puis à DecimalFormat
).
Ainsi, lorsque vous utilisez {0,choice,...}
, vous devez citer ces #
caractères, et éventuellement d'autres.
String.valueOf(long)