sábado, 9 de junio de 2012

Formateo de textos en Java

votar
Para formatear textos, Java utiliza los métodos format() y printf(), que en realidad tienen las mismas funcionalidades. Por ejemplo, podemos hacer
   
   System.out.printf(%s,%s, "Super","ejemplo");

o

   String str = String.format(%s,%s,"Super","Ejemplo");

A los que vengáis de C o algún otro lenguaje esto os resultará familiar, ya que es similar a los métodos printf y sprintf. Eso sí, tened en cuenta que Java arroja una excepción si encuentra un String mal formateado.

A los que veis esto por primera vez y os suena a chino, os lo voy a explicar con más detalle.
Supongamos que tenéis un texto:

   String s = "El número de visitantes el "+nombredia+" fue de "+numerovisitantes;

Formateando, lo dejaríamos así:

   String s = String.format("El número de visitantes el %s fue de %d", nombredia, numerovisitantes);

¿Pero que son %s y %d?
Bueno, eso son carecteres de conversión y los veremos en un momento, ahora sólo os digo que s significa string y d un número entero.

La clase java.util.Formater es la que proporciona la base para la representación de texto formateado a través de sus métodos

   format(String format, Object...args);
   format(Locale l, String format, Object...args);

El texto resultante puede ser un String, un StringBuilder, un archivo o cualquier OutputStream.
Las dos versiones del método format() también son utilizadas por las clases java.io.PrintStream y java.io.PrintWriter, que además tienen dos versiones similares del método printf().
La clase String tiene un método format(), pero es estático.

La sintaxis es la siguiente: el primer parámetro del método es el texto y los especificadores de formato, seguido de un array de argumentos.
Los especificadores se escriben en el siguiente orden (entre corchetes los que son opcionales):

   %[argument_index] [flags] [width] [precision] conversion

donde % marca el inicio de un especificador.
[argument_index] indica cuál de los argumentos se va a utilizar. Se hace con un número seguido de $. Por ejemplo:

   String str = "Año, mes, día: %3$s-%2$-%1$s";
   System.out.printf(str, 5, "Febrero", 2012);

producirá la salida

   Año, mes, día: 2012-Febrero-5

Los flags o banderas son opcionales, e indican (los coloco entre comillas aquí, pero no las llevarían en el código):

   "-":  justifica el argumento a la izquierda.
   "#":  incluye un radical para enteros y una coma para decimales.
   "+":  incluye el signo(+ o -).
   "  ":  espacio en los valores positivos.
   "0":  se llenan los espacios con ceros en los valores positivos.
   ",":  usa un separador de grupo específico según la zona geográfica.
   "(":  encierra los números negativos en paréntesis.

Width indica el número mínimo de caracteres que tendrá la salida. 
Precision indica el número máximo de dígitos después de la como en un decimal.

El especificador conversion es obligatorio e indica de qué tipo es el argumento. Los más usados son

   b: boolean.
   c: carácter Unicode.
   d: número entero.
   f: número decimal
   s: String.
   t: fecha y hora.

Veamos ahora un par de ejemplos para que lo acabéis de entender.

 int in = 1234;

 String s = String.format("El número es: %08d", in);

 System.out.println(s);


La salida será: 


   00001234


Vemos que se han añadido ceros a la izquierda, porque le hemos dado una anchura de ocho dígitos y queremos que lo que falta lo ocupen ceros.


public class EjempoFormat{
   public static void main(String[] args){
      String nombre = args[0];
      String apellido = args[1];
      String s2 = String.format("Datos:\n%1$-10s\n%2$-10s\n",nombre,apellido);
      System.out.println(s2);
   }
}

En este caso la salida serán los argumentos que introduzcamos nosotros alineados a la izquierda. Por ejemplo:


Datos:
Alfonso
López


Se pueden hacer por supuesto cosas mucho más complicadas, pero espero que esto al menos os sirva para empezar. :-)

No hay comentarios:

Publicar un comentario en la entrada