Formateo de cadenas en Java

Si has tenido algún contacto previo con C/C++ u otro lenguaje de programación puede que eches de menos un método que permita utilizar especificadores de conversión o máscaras para formatear cadenas en Java, al estilo de la función sprintf de C.

Supongamos, por ejemplo, que quisiéramos mostrar en pantalla un número en coma flotante, con la peculiaridad de que necesitáramos que sólo se mostraran 2 decimales. Podríamos, por ejemplo, convertir el número en una cadena y manipularla para quedarnos con 2 caracteres después de la coma, pero existen mejores formas de lidiar con este problema.

String.format()

La primera solución es hacer uso del método estático format de la clase String para crear una cadena que se adapte a nuestras necesidades y que más tarde imprimiremos con el consabido System.out.println() o System.out.print().

Este método toma como parámetros una cadena con uno o más especificadores de conversión y una lista de argumentos. En el siguiente fragmento de código, por ejemplo, se sustituirían los especificadores %s por el valor de las variables usuario y mensajes respectivamente.

public class Ejemplo {
	public static void main(String[] args) {
		String usuario = "zootropo";
		int mensajes = 36;

		String s = String.format("%s escribió %s mensajes", usuario, mensajes);
		System.out.println(s);
	}
}

Los distintos especificadores de conversión que podemos utilizar son los siguientes:

Especificador Formato
%b Booleano
%h Hashcode
%s Cadena
%c Caracter unicode
%d Entero decimal
%o Entero octal
%x Entero hexadecimal
%f Real decimal
%e Real notación científica
%g Real notación científica o decimal
%a Real hexadecimal con mantisa y exponente
%t Fecha u hora

A estos caracteres que indican cómo se debe formatear los distintos valores de la lista de parámetros se les puede añadir caracteres opcionales siguiendo el siguiente formato:

%[índice$][opciones][ancho][.precisión]conversión

donde índice se puede utilizar para indicar especificamente el valor de la lista de valores por el que sustituirlo

public class Ejemplo {
	public static void main(String[] args) {
    int numero = 42;

    String s = String.format("%1$d en hexadecimal es %1$x", numero);
		System.out.println(s);
	}
}

ancho es un entero no negativo que indica el número de caracteres mínimo que debe ocupar ese valor al mostrarse en pantalla. Si el valor tiene menos caracteres que los indicados se rellenará el vacío con espacios.

precisión es un entero no negativo que indica el número de decimales a utilizar para un número en coma flotante (la misma función se encarga de redondear) o el número de caracteres a mostrar para una cadena.

public class Ejemplo {
	public static void main(String[] args) {
		float numero = 3.14159f;

    String s = String.format("PI es %.3f", numero);
		System.out.println(s);
	}
}

System.out.printf()

Pero como decíamos al principio del artículo existe otra forma más para mostrar cadenas formateadas en la consola, y es el método System.out.printf(). Este método funciona de forma similar a una combinación de String.format() y System.out.print() ya que podemos pasar directamente la cadena con los especificadores de conversión y la lista de argumentos para imprimirse, de forma similar a la función sprintf de C.

El fragmento de código anterior, por ejemplo, tendría este aspecto al reescribirlo con un System.out.printf():

public class Ejemplo {
	public static void main(String[] args) {
		float numero = 3.14159f;

		System.out.printf("PI es %.3f", numero);
	}
}


Comentarios
  1. Argaen

    También se puede usar el método System.out.format() que hace más simple la primera forma, haciendo que el código:
    String s = String.format(“%1$d en hexadecimal es %1$x”, numero);
    System.out.println(s);

    Se resuma en:
    System.out.format(“%1$d en hexadecimal es %1$x”, numero);

    Responder

    • Bueno, el método format de los PrintStream funciona exactamente igual que el método printf.

      Responder

  2. Excelente aporte! 🙂 gracias

    Responder

  3. Juan perez

    public class Ejemplo {
    public static void main(String[] args) {
    double IVA String s = String.format(“15%%);
    System.out.println(s);
    }
    }

    Responder

  4. Juan perez

    public class Ejemplo {
    public static void main(String[] args) {
    double IVA String s = String.format(15%%);
    System.out.println(s);
    }
    }
    /esto nos sirve para imprimir en pantalla (15%); del IVA. Espero les sirva.

    Responder

  5. hector miguel

    eyy men me acabas de salvar la chamba .. esa era mi tarea .. buen aporte..

    Responder

  6. […] Si has tenido algún contacto previo con C/C++ u otro lenguaje de programación puede que eches de menos un método que permita utilizar especificadores de conversión o máscaras para formatear cadenas en Java, al estilo de la función sprintf de C. Supongamos, por ejemplo, que quisiéramos mostrar en pantalla un número en coma flotante, con la peculiaridad de que necesitáramos que sólo se mostraran 2 decimales. Podríamos, por ejemplo, convertir el número en una cadena y manipularla para quedarnos con 2 caracteres después de la coma, pero existen mejores formas de lidiar con este problema. Formateo de cadenas en Java […]

    Responder

  7. Arturo de Leon

    Hola me gusto mucho tema, estaba leyendo algo acerca de ello en el libro de deitel pero me quedaban muchas dudas y me las despejastes gracias solo si por hay supieras cuando formateo un float en ves de ser el numero 1,200.23 me sale alreves 1.200,23

    Responder

  8. Carlos Noriega

    Para usar el printf con arreglos de String como seria?

    Responder

Deja un comentario