Dans cet article, je souhaite parler de la classe
MessageFormat
utilisée dans la tâche 2412 (task2412). La classe MessageFormat
est conçue pour créer des chaînes. Cette classe Java prend un ensemble d'objets, les formate, puis insère les chaînes formatées dans le modèle aux emplacements appropriés. C'est une sorte d'alternative (voire d'ajout) à la méthode statique String.format
. Tout d'abord, un exemple simple d'utilisation de cette classe Java sans créer d'objet, mais en utilisant une méthode statique :
int planet = 7;
String event = "a disturbance in the Force";
String result = MessageFormat.format(
"At {0, time, medium} on {0, date}, there was {1} on planet {2, number, integer}.",
new Date(), event, planet);
System.out.println(result);
Ici, une méthode statique est appelée MessageFormat.format
, à laquelle sont passés comme arguments le modèle de chaîne et, en fait, les objets qui seront insérés dans des endroits délimités par des parenthèses {}
. La position de l'objet à partir de est précisée entre parenthèses 0
, ainsi que le type de formatage éventuel. Le résultat sera comme ceci :
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
L'exemple suivant crée déjà un objet de la classe MessageFormat
:
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = {fileCount, diskName};
MessageFormat form = new MessageFormat(
"The disk \"{1}\" contains {0} file(s).");
System.out.println(form.format(testArgs));
Lorsqu'un objet de classe est créé, MessageFormat
un modèle de chaîne est transmis à son constructeur. Ensuite, lors de l'appel d'une méthode format
sur un objet, un tableau d'objets qui sera inséré dans le modèle de chaîne y est passé en argument. Le résultat sera comme ceci :
The disk "MyDisk" contains 1 273 file(s).
Il est également possible de s'assurer que le texte requis est sélectionné en fonction de la valeur de la variable. Une sorte d'implémentation de l'opérateur if...else
, utilisant uniquement la classe ChoiceFormat
. Voici le code :
MessageFormat form = new MessageFormat("Я могу {1} {0}.");
int count = 2;
String exercise = "подтянуться";
Object[] testArgs = {count, exercise};
double[] filelimits = {0,2,5};
String[] filepart = {"{0} раз","{0} раза","{0} раз"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
form.setFormatByArgumentIndex(0, fileform);
System.out.println(form.format(testArgs));
Ce code, en fonction de la valeur de la variable, count
modifie le résultat de la ligne comme suit :
-
si
count = 1
la conclusion est comme çaЯ могу подтянуться 1 раз.
-
si
count = 2
la conclusion est comme çaЯ могу подтянуться 2 раза.
-
si
count = 7
la conclusion est comme çaЯ могу подтянуться 7 раз.
double[] filelimits
qui spécifie les limites de valeurs auxquelles la sortie des chaînes changera. Et le tableau String[] filepart
indique les variantes mêmes de chaînes qui peuvent être utilisées. Les conditions de sélection d'une option de ligne à partir de la valeur variable sont déterminées comme suit : l'option sera sélectionnée filepart[j]
si filelimits[j] =< count < filelimits[j+1]
. Ensuite, un objet est créé et les tableaux ChoiceFormat fileform
sont transmis à son constructeur . Avec la méthode, nous disons à l'objet que lorsque la méthode est appelée , puis pour l'index 0 dans le modèle de ligne, utilisez le formatage spécifié dans l'objet . Bien. En principe, vous avez peut-être déjà l'idée de ne jamais utiliser de classe Java , mais sachez que ce n'est pas tout. Il y a ce code : double[] filelimits
String[] filepart
form.setFormatByArgumentIndex(0, fileform)
MessageFormat form
format
ChoiceFormat fileform
MessageFormat
MessageFormat pattform = new MessageFormat("There {0} on {1}.\n{2} {2}");
int count = 0;
Date date = new Date();
Object[] testArgs = {count, "ADisk", date, date};
double[] filelimits = {0,1,2};
String[] filepart = {"are no files","is one file","are {0} files"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
Format[] testFormats
= {fileform, null, DateFormat.getDateInstance(DateFormat.SHORT), DateFormat.getTimeInstance(DateFormat.SHORT)};
pattform.setFormats(testFormats);
System.out.println(pattform.format(testArgs));
Voici la principale caractéristique du tableau Format[] testFormats
. Dans ce tableau, nous ajoutons des objets (implémentant la classe abstraite Format
) qui sont responsables du formatage des objets définis dans le tableau Object[] testArgs
. Format[] testFormats
Si l'objet n'a pas besoin d'être formaté, alors null
. pattform.setFormats(testFormats)
Ensuite, nous utilisons la méthode pour indiquer à l'objet MessageFormat pattform
que tous les index du modèle de ligne doivent utiliser le formatage défini dans le tableau Format[] testFormats
. Pour cet exemple, le résultat serait :
There are no files on ADisk.
28.04.18 22:10
C'est tout, et j'espère que vous n'aurez aucune difficulté à résoudre le problème 2412.
GO TO FULL VERSION