Dos formas de dar formato
Java da formato a las cadenas a partir de una plantilla que contiene especificadores de formato (los marcadores %) más los valores que se insertan. Hay dos puntos de entrada y comparten una sintaxis idéntica:
String.format(template, values...)devuelve un nuevoString.System.out.printf(template, values...)imprime el resultado directamente.
Ambas producen el mismo texto. String.format te lo devuelve para que puedas almacenarlo; printf lo escribe en la consola. Observa el %n al final de la plantilla de printf: es el salto de línea independiente de la plataforma (prefiérelo sobre \n en las cadenas de formato).
Los especificadores más comunes
Cada especificador empieza con % y termina con una letra que indica qué tipo de valor se espera:
Los tres de uso diario son %s (cualquier valor, mediante su toString), %d (números enteros) y %f (decimales). Usa %% para imprimir un signo de porcentaje literal. Pasar el tipo equivocado —por ejemplo, un String a %d— lanza una IllegalFormatConversionException en tiempo de ejecución.
Controlar las posiciones decimales
%f usa por defecto seis decimales, que rara vez es lo que quieres. Pon .N antes de la f para fijar la precisión (el valor se redondea):
Añade el indicador de coma para los separadores de agrupación en números grandes:
Ancho y relleno
Un número entre el % y la letra del tipo establece un ancho mínimo de campo, rellenando con espacios para que las columnas se alineen. Un - inicial alinea a la izquierda; un 0 inicial rellena los números con ceros:
Esto es lo que hace legibles las tablas formateadas y los informes alineados:
El %-8s alinea los nombres a la izquierda en una columna de 8 de ancho y %5d alinea las puntuaciones a la derecha en una columna de 5 de ancho, de modo que los números quedan alineados sin importar la cantidad de dígitos.
Orden de los argumentos
De forma predeterminada, los especificadores consumen los valores de izquierda a derecha. Puedes repetir o reordenar un valor con N$ (índice basado en uno), útil cuando el mismo valor aparece dos veces:
%1$s se refiere al primer argumento las dos veces, por lo que echo se imprime dos veces.
El método formatted()
Desde Java 15, toda cadena tiene un método de instancia formatted: el mismo motor que String.format, solo que escrito como una llamada de método sobre la plantilla:
Combina especialmente bien con los text blocks (cadenas multilínea entre comillas triples) al construir salidas formateadas más grandes.
Cuándo no usar String.format
Para uniones sencillas y puntuales, la concatenación simple con + es más clara y rápida:
String greeting = "Hi, " + name + "!"; // simpler than String.format here
Recurre a String.format / printf cuando necesites formato de verdad —decimales fijos, relleno, alineación, agrupación— y no solo pegar un par de valores.
Siguiente: Operadores
Dar formato convierte valores en texto. Para calcular esos valores en primer lugar necesitas los operadores de Java: aritméticos, de comparación y lógicos. Esa es la siguiente página.
Preguntas frecuentes
¿Cómo se da formato a una cadena en Java?
Usa String.format(template, values...), que devuelve una nueva cadena con cada especificador de formato reemplazado por un valor: String.format("%s is %d", name, age). Para imprimir directamente en lugar de construir una cadena, usa System.out.printf(...) con la misma plantilla. Desde Java 15 también puedes llamar a template.formatted(values...).
¿Cómo se da formato a un número con dos decimales en Java?
Usa el especificador %.2f: String.format("%.2f", 3.14159) produce "3.14". El número que va tras el punto indica cuántos decimales conservar, y el valor se redondea. Para separadores de miles añade el indicador de coma: %,.2f da "1,234.57".
¿Cuál es la diferencia entre String.format y printf en Java?
Usan exactamente los mismos especificadores de formato. String.format(...) devuelve el texto formateado como un nuevo String que puedes almacenar o pasar de un lado a otro. System.out.printf(...) escribe el texto formateado directamente en la salida estándar y no devuelve nada útil. Usa String.format para construir una cadena y printf para imprimir una.