sprintf en PHP: formatear cadenas con precisión

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP