En este artículo quiero hablar sobre la clase
MessageFormat
que se utiliza en la tarea 2412 (task2412). La clase MessageFormat
está diseñada para crear cadenas. Esta clase Java toma un conjunto de objetos, los formatea y luego inserta las cadenas formateadas en la plantilla en las ubicaciones apropiadas. Este es un tipo de alternativa (o incluso adición) al método estático String.format
. Primero, un ejemplo simple del uso de esta clase Java sin crear un objeto, pero usando un método estático:
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);
Aquí se llama a un método estático MessageFormat.format
al que se le pasan como argumentos la plantilla de cadena y, de hecho, los objetos que se insertarán en lugares delimitados por paréntesis {}
. Entre paréntesis se especifica la posición del objeto que comienza en 0
, así como el tipo de formato, si corresponde. La salida será así:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
El siguiente ejemplo ya crea un objeto de la clase 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));
Cuando se crea un objeto de clase, MessageFormat
se pasa una plantilla de cadena a su constructor. A continuación, cuando se llama a un método format
en un objeto, se pasa allí como argumento una matriz de objetos que se insertarán en la plantilla de cadena. La salida será así:
The disk "MyDisk" contains 1 273 file(s).
También es posible asegurarse de que el texto requerido esté seleccionado dependiendo del valor de la variable. Una especie de implementación del operador if...else
, utilizando únicamente la clase ChoiceFormat
. Aquí está el código:
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));
Este código, dependiendo del valor de la variable, count
cambia la salida de la línea de la siguiente manera:
-
si
count = 1
la conclusión es asíЯ могу подтянуться 1 раз.
-
si
count = 2
la conclusión es asíЯ могу подтянуться 2 раза.
-
si
count = 7
la conclusión es asíЯ могу подтянуться 7 раз.
double[] filelimits
que especifica los límites de valores en los que cambiará la salida de las cadenas. Y la matriz String[] filepart
indica las variantes de cadenas que se pueden utilizar. Las condiciones para seleccionar una opción de línea del valor de la variable se determinan de la siguiente manera: la opción se seleccionará filepart[j]
si filelimits[j] =< count < filelimits[j+1]
. A continuación, se crea un objeto y las matrices se ChoiceFormat fileform
pasan a su constructor . Con el método, le decimos al objeto que cuando se llame al método , para el índice 0 en la plantilla de fila, use el formato especificado en el objeto . Bien. En principio, es posible que ya tengas la idea de no usar nunca una clase Java , pero debes saber que esto no es todo. Existe este código: 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));
Aquí está la característica principal de la matriz Format[] testFormats
. En este arreglo agregamos objetos (implementando la clase abstracta Format
) que se encargan de formatear los objetos definidos en el arreglo Object[] testArgs
. Format[] testFormats
Si el objeto no necesita formato, entonces null
. pattform.setFormats(testFormats)
A continuación, usamos el método para decirle al objeto MessageFormat pattform
que todos los índices en el patrón de fila deben usar el formato definido en la matriz Format[] testFormats
. Para este ejemplo, el resultado sería:
There are no files on ADisk.
28.04.18 22:10
Eso es todo y espero que no tengas ninguna dificultad a la hora de resolver el problema 2412.
GO TO FULL VERSION