sprintf() devuelve una cadena formateada según una plantilla con especificadores de formato. A diferencia de printf(), que imprime directamente, sprintf() guarda el resultado en una variable para que puedas usarlo donde te haga falta: pasarlo a otra función, acumularlo en un array o devolverlo desde un método.
Sintaxis y especificadores más usados
<?php sprintf(string $format, mixed ...$values): string ?>
La cadena $format contiene texto literal y marcadores de posición que empiezan por %. Los más habituales son:
%s cadena de texto%d entero (decimal)%f número de coma flotante%.2f float con exactamente dos decimales%05d entero con padding de ceros hasta 5 caracteres
Formatear precios con IVA
El caso más típico es mostrar importes con dos decimales y separadores correctos:
<?php
$precioNeto = 129.9;
$iva = 21;
$precioFinal = $precioNeto * (1 + $iva / 100);
$linea = sprintf(
'Precio con IVA (%d%%): %.2f ',
$iva,
$precioFinal
);
echo $linea;
// Precio con IVA (21%): 157.18
?>
Observa el %% para imprimir un signo de porcentaje literal. Con un solo % PHP intentaría interpretarlo como especificador y lanzaría un error.
Padding con ceros a la izquierda para pedidos y SKUs
Los sistemas de referencia suelen requerir identificadores de longitud fija. Con %0Nd (donde N es la longitud deseada) PHP rellena con ceros automáticamente:
<?php
$ids = [1, 42, 387, 9001];
foreach ($ids as $id) {
$referencia = sprintf('PED-%06d', $id);
echo $referencia . "n";
}
// PED-000001
// PED-000042
// PED-000387
// PED-009001
?>
Diferencia entre sprintf() y printf()
printf() imprime directamente y devuelve el número de caracteres escritos. sprintf() devuelve la cadena formateada sin imprimir nada. Usa printf() cuando solo necesites mostrar el valor; usa sprintf() cuando necesites guardarlo, concatenarlo o pasarlo a otra función:
<?php
// printf() imprime en ese momento
printf('Total: %.2f ', 89.5); // imprime: Total: 89.50
// sprintf() devuelve para usar después
$asunto = sprintf('Tu pedido #%05d está listo', 743);
mail('[email protected]', $asunto, $cuerpo);
?>
Formato de URLs y logs
En scripts de migración o generadores de contenido, construir cadenas con estructura fija es mucho más legible con sprintf() que con concatenación:
<?php
$base = 'https://api.ejemplo.com';
$version = 2;
$recurso = 'productos';
$id = 1584;
$url = sprintf('%s/v%d/%s/%d', $base, $version, $recurso, $id);
echo $url;
// https://api.ejemplo.com/v2/productos/1584
// Log con timestamp y nivel
$log = sprintf('[%s][%s] %s', date('Y-m-d H:i:s'), 'ERROR', 'Conexión rechazada');
echo $log;
// [2024-06-15 09:23:41][ERROR] Conexión rechazada
?>
El orden de argumentos y los errores comunes
Los argumentos van en el mismo orden en que aparecen los especificadores. Si tienes muchos puede ser útil usar posiciones explícitas con %1$s, %2$d, etc., aunque en la práctica suele bastar con mantener la plantilla junto al listado de valores:
<?php
// Sin posición explícita: los valores van en orden
$txt = sprintf('%s tiene %d años y pesa %.1f kg', 'Ana', 32, 61.5);
echo $txt; // Ana tiene 32 años y pesa 61.5 kg
// Con posición explícita: útil para reutilizar el mismo argumento
$plantilla = 'El artículo %1$s está en oferta. Compra %1$s ahora.';
echo sprintf($plantilla, 'PHP Avanzado');
// El artículo PHP Avanzado está en oferta. Compra PHP Avanzado ahora.
?>
La documentación oficial de sprintf() lista todos los especificadores de formato disponibles, incluidos los de notación científica, octal y hexadecimal.
