Ceros a la izquierda en Java: de principiante a profesional con medición de rendimiento
\n\nTodo desarrollador Java, tarde o temprano, se enfrenta a la tarea: «¿Cómo agregar ceros a la izquierda de un número?». Parece una operación trivial: tomar el número 42 y convertirlo en "000042". Pero en cuanto empiezas a buscar en Google, te encuentras con decenas de formas: String.format, DecimalFormat, StringBuilder, bucles manuales e incluso String.repeat (Java 11+).
La pregunta «How can I pad an integer with zeros on the left?» en Stack Overflow ha acumulado miles de visitas. Y no es casualidad. Detrás de una acción simple se esconde todo un abanico de dilemas: ¿qué método es más rápido? ¿Cuál es más legible? ¿Cuál no matará el rendimiento en una aplicación de alta carga?
\n\nEn este artículo no solo mostraremos código. Realizaremos nuestra propia mini-investigación, mediremos la velocidad de cada enfoque y daremos recomendaciones claras. Aprenderá cuándo puede sacrificar microsegundos por elegancia y cuándo es mejor escribir código «sucio» pero ultrarrápido.
\n\n¿Por qué es importante? Contexto de rendimiento
\n\nSupongamos que está generando millones de identificadores de cadena en un proceso ETL, números de pedido o serializando datos para registros. Cada nanosegundo adicional en el padding zeros se multiplica por la cantidad de operaciones. La diferencia entre el «bonito» String.format y el manual StringBuilder puede ser de cientos de puntos porcentuales.
Pero no se apresure a optimizar todo. Como dijo Donald Knuth: «La optimización prematura es la raíz de todos los males». Primero, comprendamos las herramientas y luego decidamos cuál elegir.
\n\nMétodo 1: String.format() — el rey de la legibilidad
\n\nLa opción más popular e intuitiva. El método String.format() utiliza el especificador %0Nd, donde N es la longitud total de la cadena resultante.
int number = 42;\nString padded = String.format("%06d", number); // "000042"\nSystem.out.println(padded);\n\nLas ventajas son obvias: el código se lee como texto normal, no hay que pensar en casos límite. La desventaja es el rendimiento. String.format internamente crea un Formatter y analiza la cadena de formato en cada llamada. Para operaciones únicas es ideal, para un bucle de 10 millones de iteraciones es cuestionable.
Método 2: DecimalFormat — el legado de los formatos monetarios
\n\nLa clase DecimalFormat del paquete java.text fue creada originalmente para formatear monedas y porcentajes, pero también maneja perfectamente los leading zeros.
import java.text.DecimalFormat;\n\nDecimalFormat df = new DecimalFormat("000000");\nString padded = df.format(42); // "000042"\n\nEl detalle principal: DecimalFormat no es seguro para subprocesos. Si lo usa en un entorno multiproceso, tendrá que sincronizar o crear una nueva instancia para cada llamada (lo que mata el rendimiento).
Método 3: StringBuilder + cálculo manual — modo hardcore
\n\nPara aquellos que no temen escribir un par de líneas adicionales por velocidad. Creamos un arreglo de caracteres de la longitud deseada, lo llenamos con ceros y luego copiamos los dígitos del número desde el final.
\n\npublic static String padLeftZeros(int number, int totalLength) {\n char[] result = new char[totalLength];\n for (int i = 0; i < totalLength; i++) {\n result[i] = '0';\n }\n int index = totalLength - 1;\n while (number > 0 && index >= 0) {\n result[index--] = (char) ('0' + (number % 10));\n number /= 10;\n }\n return new String(result);\n}\n\n// Uso:\nString padded = padLeftZeros(42, 6); // "000042"\n\nEste método funciona varias veces más rápido que String.format, pero requiere cuidado: hay que manejar números negativos (no los consideramos por simplicidad) y el caso en que el número sea más largo que la longitud especificada.