Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

Lección: printf() y sprintf()

Las funciones printf() y sprintf() son herramientas esenciales en PHP para crear cadenas formateadas con precisión, ya sea para mostrar números, alinear texto, o generar salidas personalizadas. En esta lección, veremos cómo funcionan, sus diferencias, y cómo usarlas con ejemplos prácticos.

Introducción

printf() y sprintf() permiten formatear cadenas usando patrones de formato, que combinan texto normal con marcadores (%) para insertar valores. La diferencia clave es:

  • printf(): Imprime la cadena formateada directamente (salida al navegador).
  • sprintf(): Devuelve la cadena formateada para almacenarla o procesarla.

Ejemplo básico:

<?php
declare(strict_types=1);

$nombre = "Ana";
printf("Hola, %s!\n", $nombre); // Imprime: Hola, Ana!
$saludo = sprintf("Hola, %s!\n", $nombre); // Almacena: Hola, Ana!
echo $saludo;
?>

Nota: Usa declare(strict_types=1) para evitar errores de tipo en los argumentos.

Sintaxis de los Patrones

Un patrón de formato sigue esta estructura:

%[alineación][ancho][.precisión]especificador
  • Alineación: - para alinear a la izquierda (por defecto, derecha).
  • Ancho: Número mínimo de caracteres (rellena con espacios o ceros).
  • Precisión: Para floats, número de decimales; para strings, máximo de caracteres; para enteros, mínimo de dígitos.
  • Especificador: Define el tipo de dato:
    • b: Binario (entero en base 2).
    • c: Carácter (ASCII desde un entero).
    • d: Decimal (entero en base 10).
    • e: Exponencial (notación científica).
    • f: Float (punto flotante).
    • o: Octal (entero en base 8).
    • x: Hexadecimal (minúsculas).
    • X: Hexadecimal (mayúsculas).
    • s: String (cadena).

Ejemplo de patrón:

<?php
printf("%-10s", "Hola"); // Imprime: Hola      (10 caracteres, alineado a la izquierda)
?>

Otro ejemplo:

<?php
printf("Nombre: %-10s | Edad: %3d | Saldo: %.2f EUR\n", "Ana", 25, 1234.5);
// Imprime: Nombre: Ana | Edad:  25 | Saldo: 1234.50 EUR

En este ejemplo, %3d indica un número entero con un ancho mínimo de 3 caracteres, y %.2f indica un número de punto flotante con 2 decimales.

Opciones de Relleno

  • 0: Rellena con ceros en lugar de espacios.
  • 'x: Usa el carácter x para rellenar (por ejemplo, '*').
<?php
printf("%010d", 123);    // Imprime: 0000000123
printf("%'*10d", 123);   // Imprime: *******123
?>

Ejemplos Prácticos

Números de Punto Flotante

<?php
declare(strict_types=1);

$pi = M_PI;
printf("Pi con 2 decimales: %.2f\n", $pi);     // Imprime: 3.14
printf("Pi con 5 decimales: %.5f\n", $pi);     // Imprime: 3.14159
printf("Pi exponencial: %e\n", $pi);           // Imprime: 3.141593e+00
?>

Nota: Usa constantes para formatos comunes:

<?php
const FORMATO_2DEC = "%.2f";
printf(FORMATO_2DEC . "\n", $pi);
?>

Enteros en Diferentes Bases

<?php
declare(strict_types=1);

$numero = 255;
printf("Decimal: %d\n", $numero);      // Imprime: 255
printf("Binario: %b\n", $numero);      // Imprime: 11111111
printf("Octal: %o\n", $numero);        // Imprime: 377
printf("Hex (min): %x\n", $numero);    // Imprime: ff
printf("Hex (may): %X\n", $numero);    // Imprime: FF
?>

Nota: Usa (int) para datos de formularios:

<?php
$entrada = (int)$_POST["numero"] ?? 0;
printf("%d\n", $entrada);
?>

Caracteres ASCII

<?php
printf("ASCII 65: %c\n", 65); // Imprime: A
?>

Cadenas con Ancho y Precisión

<?php
declare(strict_types=1);

$texto = "PHP es un lenguaje poderoso";
printf("Original: %s\n", $texto);           // Imprime: PHP es un lenguaje poderoso
printf("Primeros 10: %.10s\n", $texto);     // Imprime: PHP es un
printf("Alineado derecha: %30s\n", $texto); // Imprime:     PHP es un lenguaje poderoso
printf("Alineado izquierda: %-30s*\n", $texto); // Imprime: PHP es un lenguaje poderoso     *
?>

Usa htmlspecialchars() si muestras datos de usuarios para evitar XSS:

<?php
$texto = htmlspecialchars($texto, ENT_QUOTES, "UTF-8");
?>

Usando sprintf()

<?php
declare(strict_types=1);

$formateado = sprintf("El número %d en hex es %X", 100, 100);
echo $formateado . "\n"; // Imprime: El número 100 en hex es 64
?>

Rendimiento y Comparación con echo y print

printf() y sprintf() son más lentos que echo y print para salidas simples, ya que procesan patrones de formato. Usa echo o print para texto sin formato:

<?php
declare(strict_types=1);

echo "Hola", " ", "mundo", "!\n"; // Más rápido, acepta múltiples argumentos
print "Hola mundo!\n"; // Ligeramente más lento, un solo argumento
// print "Hola", "mundo"; // Error: solo un argumento
?>

Nota: echo es ideal para salidas rápidas.
print devuelve 1, útil en expresiones.
Usa . para concatenar con echo o print.

Seguridad

  • Datos de usuarios: Sanitiza entradas con filter_input() o (string) para evitar inyecciones:
<?php
$entrada = filter_input(INPUT_POST, "texto", FILTER_SANITIZE_STRING) ?? "";
printf("%s\n", $entrada);
?>
  • XSS: Usa htmlspecialchars() al mostrar datos formateados en HTML.

Siguiente

Manipulación de cadenas de texto

TOP