Menu

PHP sprintf(): formatear strings, relleno y decimales

sprintf() construye una cadena a partir de un formato y unos valores: sprintf('%05.2f', 3.14159) devuelve "03.14". Aprende %s, %d y %f, el relleno con ceros, los decimales fijos, la alineación, la numeración de argumentos, printf y vsprintf.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

sprintf() devuelve una cadena construida a partir de un formato y una lista de valores: cada marcador % del formato se sustituye por el siguiente valor. sprintf('%s is %d years old', 'Ada', 36) devuelve "Ada is 36 years old". printf() acepta los mismos argumentos pero imprime el resultado en lugar de devolverlo.

Los marcadores se rellenan en orden, de izquierda a derecha. %.2f muestra siempre dos decimales (4.50, no 4.5), y %05d rellena el número con ceros hasta cinco dígitos.

Los especificadores de formato

Un marcador es %, unos modificadores opcionales y luego una letra para el tipo:

EspecificadorSignificadosprintf(...)Resultado
%scadenasprintf('%s', 'PHP')PHP
%dentero (con signo)sprintf('%d', 42.9)42
%ffloat, 6 decimales por defectosprintf('%f', 1.5)1.500000
%.2ffloat, 2 decimalessprintf('%.2f', 1.5)1.50
%enotación científicasprintf('%e', 1234.5678)1.234568e+3
%x / %Xhexadecimalsprintf('%x', 255)ff
%ooctalsprintf('%o', 8)10
%bbinariosprintf('%b', 5)101
%ccarácter a partir de un códigosprintf('%c', 65)A
%uentero sin signosprintf('%u', 3)3
%%un signo de porcentaje literalsprintf('%d%%', 50)50%

Cambia los valores de abajo y vuelve a ejecutarlo:

%d trunca un float hacia cero, así que 42.9 se convierte en 42. Si quieres 43, redondea primero: sprintf('%d', round(42.9)). Una cadena que no es un número, como 'abc', se convierte en 0 con %d.

Rellenar con ceros a la izquierda

Entre % y la letra puedes poner un carácter de relleno y un ancho. %05d significa "rellena con 0 hasta un ancho de 5". Es la forma habitual de formatear números de pedido, IDs de factura, horas y fechas.

El ancho es un mínimo. Un número más largo que el ancho se imprime completo.

%05.2f: ancho y decimales a la vez

Con floats, el ancho cuenta cada carácter del resultado, incluidos el punto decimal y el signo menos. Por eso %05.2f aplicado a 3.14159 da 03.14: cinco caracteres en total, dos de ellos tras el punto.

%f usa el separador decimal de la configuración regional actual (fijada con setlocale()), mientras que %F usa siempre un punto. Si tu código fija una configuración regional y necesitas un punto para JSON, CSV o una API, usa %F.

Alinear texto en columnas

Un ancho positivo alinea a la derecha, un - antes del ancho alinea a la izquierda, y ' seguido de un carácter fija un carácter de relleno personalizado. Combinados, alinean informes y tickets en texto plano.

%-14s rellena el nombre del artículo por la derecha hasta 14 caracteres, %8.2f alinea el precio a la derecha en 8 caracteres y %'-27s con una cadena vacía imprime una línea de 27 guiones. %'*10s rellena con * en lugar de espacios.

Numerar los argumentos para reutilizarlos o reordenarlos

%1$s significa "el primer argumento como cadena" y %2$d "el segundo como entero". Los marcadores numerados te permiten usar un valor dos veces o cambiar el orden sin cambiar la lista de argumentos, algo que necesitan los traductores cuando el orden de las palabras cambia entre idiomas.

vsprintf, printf y los valores de retorno

vsprintf() recibe los valores como un solo array, algo práctico cuando ya están en un array. printf() devuelve el número de bytes que imprimió, y vprintf() es la versión con array de printf().

El recuento de printf() incluye el salto de línea, así que "Hello\n" son 6 bytes. Con texto multibyte cuenta bytes, no caracteres.

Pocos argumentos lanzan un error

Desde PHP 8, un formato con más marcadores que valores lanza un ArgumentCountError en lugar de devolver false. Cuenta los marcadores % (sin contar %%) cuando veas este error.

El mensaje cuenta la cadena de formato como un argumento: ArgumentCountError: 4 arguments are required, 3 given. Los argumentos de más se ignoran en silencio, así que el error contrario no aparece como error. Si el resultado de un sprintf parece incorrecto, imprime el formato junto a los valores. Cuando solo necesitas un separador de miles, number_format() es más sencillo que construirlo con sprintf. La lista completa de modificadores está en php.net.

Preguntas frecuentes

¿Cómo añado ceros a la izquierda a un número en PHP?

Usa sprintf('%05d', 42), que devuelve "00042". El 0 es el carácter de relleno y 5 es el ancho total. Para una cadena, str_pad('42', 5, '0', STR_PAD_LEFT) da el mismo resultado.

¿Cómo formateo un número con 2 decimales con sprintf?

Usa %.2f: sprintf('%.2f', 3.14159) devuelve "3.14" y sprintf('%.2f', 5) devuelve "5.00". Añade un ancho para rellenarlo también: %08.2f da "00003.14".

¿Cuál es la diferencia entre printf y sprintf en PHP?

sprintf() devuelve la cadena formateada para que puedas guardarla. printf() la imprime directamente y devuelve el número de bytes impresos. echo sprintf(...) y printf(...) producen la misma salida.

¿Qué significa %s en PHP?

%s es un marcador para una cadena en sprintf() y printf(): sprintf('Hello, %s', 'Ada') devuelve "Hello, Ada". Los números que se pasan a %s se convierten en cadenas. %d es para enteros y %f para floats.

¿Cómo uso el mismo argumento dos veces en sprintf?

Numera los marcadores: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). Pon el formato entre comillas simples: dentro de comillas dobles PHP lee $s como una variable, así que "%1$s" se convierte en %1 seguido del valor de $s.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR