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); } }
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);
Bueno, el método
format
de losPrintStream
funciona exactamente igual que el métodoprintf
.Excelente aporte! 🙂 gracias
public class Ejemplo {
public static void main(String[] args) {
double IVA String s = String.format(«15%%);
System.out.println(s);
}
}
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.
eyy men me acabas de salvar la chamba .. esa era mi tarea .. buen aporte..
Pingback: Java | Pearltrees
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
Para usar el printf con arreglos de String como seria?