Luché un poco con esto cuando traté de hacer patrones del "mundo real" con internacionalización, etc. Específicamente, tenemos la necesidad de usar un formato de "elección" donde la salida depende de los valores que se muestran, y para eso java.text.ChoiceFormat
está.
Aquí hay un ejemplo de cómo hacer esto:
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));
}
Esto genera el siguiente resultado; Espero que sea útil para otros que están tratando de lograr el mismo tipo de cosas:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Como puede ver, el formato de "elección" nos permite elegir el tipo de formato que se utilizará en función del valor que se va a pasar a formatear. Los números pequeños se pueden reemplazar con texto (no se muestra el valor original). Los números de tamaño mediano se muestran sin separadores de agrupación (sin comas). Los números más grandes incluyen las comas, nuevamente. Obviamente, este es un ejemplo totalmente artificial para demostrar la flexibilidad de java.text.MessageFormat
.
Una nota sobre lo citado #
en el formato de texto: dado que ambos ChoiceFormat
y MessageFormat
se están utilizando, existe una colisión entre metacaracteres entre los dos. ChoiceFormat
usos #
como un meta que esencialmente significa "igual" para que el motor de formatear sabe que por ejemplo en el caso de 1#one!
que estamos comparando {0}
con 1
, y si son iguales, se utiliza esa "elección" en particular.
Pero #
tiene otro significado para MessageFormat
, y eso es como un metacarácter que tiene significado para DecimalFormat
: es un metacarácter que significa "poner un número aquí".
Debido a que está envuelto en una ChoiceFormat
cadena, #
es necesario citarlo. Cuando ChoiceFormat
termina de analizar la cadena, esas comillas se eliminan al pasar los subformatos a MessageFormat
(y luego a DecimalFormat
).
Entonces, cuando está usando {0,choice,...}
, debe citar esos #
caracteres, y posiblemente otros.
String.valueOf(long)