1. El problema de la concatenación manual
Si solo hay que mostrar una o dos variables, el operador + es realmente cómodo. Pero cuando hay muchos datos, la concatenación se convierte rápido en un caos, especialmente si hace falta formatear números (por ejemplo, 2 decimales) o saltos de línea.
String name = "Oleg";
int age = 25;
double balance = 12345.67;
System.out.println("Nombre: " + name + ", edad: " + age + ", saldo: " + balance + " euros.");
Intentar «mejorar» el formateo dentro de la concatenación solo empeora la legibilidad:
System.out.println("Nombre: " + name + ", edad: " + age + ", saldo: " + String.format("%.2f", balance) + " euros.");
Conclusión: la concatenación simple está bien para cosas pequeñas, pero para mensajes complejos hace falta una herramienta más potente — String.format().
2. String.format: formatea cadenas de forma profesional
El método String.format() permite crear una cadena a partir de una plantilla e insertar valores en las posiciones indicadas.
Forma general:
String result = String.format("Plantilla", values);
- %s — cadena
- %d — entero
- %f — número de coma flotante
- %n — salto de línea (multiplataforma)
String name = "Oleg";
int age = 25;
double balance = 12345.6789;
String info = String.format("Nombre: %s, edad: %d, saldo: %.2f euros.", name, age, balance);
System.out.println(info);
// Mostrará: Nombre: Oleg, edad: 25, saldo: 12345.68 euros.
String result = String.format("Nombre: %s, edad: %d, saldo: %.2f euros", name, age, balance);
// %s — cadena, %d — entero, %.2f — número con 2 decimales
Formateo de números y cadenas
Números decimales con precisión fija:
double price = 99.999;
System.out.println(String.format("Precio: %.2f euros.", price)); // Precio: 100.00 euros.
Ancho de campo y alineación:
int n = 7;
System.out.println(String.format("Número: [%5d]", n)); // Número: [ 7]
System.out.println(String.format("Número: [%-5d]", n)); // Número: [7 ]
[5d] — ancho de campo 5, alineación a la derecha por defecto;
[-5d] — ancho de campo 5, alineación a la izquierda.
Cadenas con alineación:
String text = "Java";
System.out.println(String.format("[%10s]", text)); // [ Java]
System.out.println(String.format("[%-10s]", text)); // [Java ]
Porcentajes:
double percent = 0.125;
System.out.println(String.format("Listo: %.1f%%", percent * 100)); // Listo: 12.5%
Para imprimir el símbolo de porcentaje, usa %%.
Formateo de fechas (breve)
import java.util.Date;
Date now = new Date();
System.out.println(String.format("Hoy: %tD", now)); // Hoy: 06/18/24
System.out.println(String.format("Hora: %tT", now)); // Hora: 15:42:07
Localización y separadores
Por defecto se utiliza la configuración regional del sistema. Para indicar la tuya (por ejemplo, la coma como separador decimal), pasa una configuración regional — por ejemplo, Locale.FRANCE.
import java.util.Locale;
double price = 1234.56;
System.out.println(String.format(Locale.FRANCE, "%.2f", price)); // 1234,56
Ejemplos prácticos
Ejemplo 1: informe breve
String name = "Anna";
int tasks = 5;
double hours = 12.3456;
String report = String.format(
"Empleado: %s%nTareas realizadas: %d%nHoras invertidas: %.1f",
name, tasks, hours
);
System.out.println(report);
/* Salida:
Empleado: Anna
Tareas realizadas: 5
Horas invertidas: 12.3
*/
Ejemplo 2: tabla con alineación
String header = String.format("%-10s | %5s | %8s", "Nombre", "Puntos", "Tiempo");
String row1 = String.format("%-10s | %5d | %8.2f", "Oleg", 95, 10.5);
String row2 = String.format("%-10s | %5d | %8.2f", "Anna", 100, 9.75);
System.out.println(header);
System.out.println(row1);
System.out.println(row2);
/* Salida:
Nombre | Puntos | Tiempo
Oleg | 95 | 10.50
Anna | 100 | 9.75
*/
Ejemplo 3: texto mixto
int apples = 12;
int pears = 8;
System.out.println(String.format("Tengo %d manzanas y %d peras.", apples, pears));
3. Práctica: formateo de cadenas en nuestra aplicación
Añadamos formateo a una aplicación de consola: saldo siempre con dos decimales y saltos de línea con %n.
Scanner console = new Scanner(System.in);
System.out.print("Introduce el nombre: ");
String name = console.nextLine();
System.out.print("Introduce la edad: ");
int age = console.nextInt();
System.out.print("Introduce el saldo: ");
double balance = console.nextDouble();
// Salida formateada
String info = String.format("Nombre: %s, edad: %d, saldo: %.2f euros.", name, age, balance);
System.out.println(info);
Prueba:
- Introducir distintos valores y comprobar que el saldo siempre se muestra con dos decimales (%.2f).
- Cambiar la plantilla para añadir saltos de línea con %n.
4. Errores típicos al formatear cadenas
Error n.º 1: desajuste entre tipos y marcadores.
No se puede pasar una cadena a %d ni un número a %s.
String.format("Edad: %d", "veinte"); // Error: se esperaba un número, se ha pasado una cadena
Error n.º 2: orden de argumentos incorrecto.
La plantilla es %s %d, pero pasaste primero un número y luego una cadena: obtendrás un error o una salida incorrecta.
Error n.º 3: ignorar la configuración regional.
Esperabas la coma como separador decimal pero ves el punto; indica la configuración regional adecuada explícitamente como primer parámetro de String.format(...).
Error n.º 4: símbolo de porcentaje sin escape.
Para mostrar el símbolo %, usa %%; de lo contrario, el formateo fallará con un error.
GO TO FULL VERSION