JavaRush /Blog Java /Random-ES /Clase de formato de mensaje
Виталий Рыжаков
Nivel 40
Москва

Clase de formato de mensaje

Publicado en el grupo Random-ES
En este artículo quiero hablar sobre la clase MessageFormatque se utiliza en la tarea 2412 (task2412). Formato de mensaje de clase - 1La clase MessageFormatestá 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.formatal 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, MessageFormatse pasa una plantilla de cadena a su constructor. A continuación, cuando se llama a un método formaten 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, countcambia la salida de la línea de la siguiente manera:
  • si count = 1la conclusión es así

    Я могу подтянуться 1 раз.
  • si count = 2la conclusión es así

    Я могу подтянуться 2 раза.
  • si count = 7la conclusión es así

    Я могу подтянуться 7 раз.
Este código crea una matriz double[] filelimitsque especifica los límites de valores en los que cambiará la salida de las cadenas. Y la matriz String[] filepartindica 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 fileformpasan 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[] filelimitsString[] filepartform.setFormatByArgumentIndex(0, fileform)MessageFormat formformatChoiceFormat fileformMessageFormat
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[] testFormatsSi el objeto no necesita formato, entonces null. pattform.setFormats(testFormats)A continuación, usamos el método para decirle al objeto MessageFormat pattformque 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.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION