printf, sprintf
printf() y sprintf()
Estas funciones sirven para manipular (dar formato) a una cadena. La única diferencia entre ellas es que printf vuelca la cadena con formato, mientras que sprintf solo da formato, sin volcarlo, con lo cual podemos almacenarlo en una variable.
La cadena que contiene las instrucciones de formato permite usar tanto patrones como caracteres normales. Los patrones van precedidos del signo %, y sus valores se incluiran en la cadena formateada, o indicarán como debe ser presentada.
La sintaxis genérica es la siguiente (donde [...] significa parámetro opcional):
% [ - ] [ n ] [ . nn ] caracter
El significado del patrón depende del caracter final (especificador):
- especificador b
- el argumento es interpretado como un número entero, y presentado como un número binario.
- especificador c
- el argumento es interpretado como un entero, y presentado como el caracter ASCII con dicho valor.
- especificador d
- el argumento es tratado como un entero y presentado con notación decimal
- especificador e
- el argumento es tratado como un entero y presentado con notación exponencial.
- especificador f
- el argumento es tratado como un double y presentado como un número de coma flotante.
- especificador o
- el argumento es tratado como un entero, y presentado como un número octal.
- especificador x
- el argumento es tratado como un entero y presentado como un número hexadecimal (con minúsculas).
- especificador X
- el argumento es tratado como un entero y presentado como un número hexadecimal (con mayusculas).
- especificador s
- el argumento es tratado como una cadena y es presentado como tal.
Entre el signo % y el caracter especificador podemos incluir uno o dos números, ambos opcionales. Si existen, el primer número indica el número de caracteres (anchura) que debe ocupar la cadena formateada. printf devolverá como mínino ese numero de caracteres, o mas si el resultado excede. Si no indicamos este número, printf devolverá los caracteres que sean necesarios.
Para rellenar los caracteres necesarios usualmente se usan espacios en blanco, aunque podemos indicar que alternativamente se usen ceros o cualquier otro caracter. Estos caracteres de relleno normalmente preceden al resultado, aunque con el - podemos hacer que vayan al final.
Si el primer numero es un cero, la anchura extra será llenada con ceros y no con espacios en blanco. En este caso se ignora el signo - aunque lo hayamos puesto. Y podemos especificar cualquier otro caracter de relleno si le precede una comilla simple ‘
Podemos indicar la precisión en la respuesta con un punto seguido de un número: .n
Si lo usamos con decimales obtendremos el numero de decimales a mostrar (se redondea el resultado en su caso). Si lo usamos con números enteros, la salida será el mismo número, completado con ceros.
Entre el signo % y el caracter especificador, podemos usar el guion - (alinear el resultado a la izquierda) o un numero entero (que delimita el numero de caracteres que nos son devueltos) o una combinación de números m.n donde m representa el numero de caracteres a devolver y n el numero de decimales a obtener
ejemplos
<?php
// M_PI es una variable predefinida
// con el valor de Pi
printf ("Pi es: %d", M_PI); // 3
printf ("Pi es: %.2f", M_PI); // 3.14
printf ("Pi es: %.3f", M_PI); // 3.142
printf ("Pi es: %.4f", M_PI); // 3.1416
$numero = 65;
printf("%c",$numero); // imprime "A"
for($count=97; $count<=122; $count++) // imprime caracteres ascii desde
{ // la posicion 97 a la 122:
printf ("%c" , $count); // abcdefghijklmnopqrstuvwxyz
}
printf("uno vale %d; otro vale %c", $numero,$numero);
// imprime "uno vale 65; otro vale A"
$number= 255;
printf("En formato decimal: %d",$number); //"En formato decimal: 255"
printf("En formato hexadecimal: %x",$number); //"En formato hexadecimal: ff"
printf("En formato hexadecimal: %X",$number); //"En formato hexadecimal: FF"
printf("En formato octal: %o",$number); //"En formato octal: 377"
printf("Decimal exponencial: %e",$number); //"Decimal exponencial: 2.55000e+2"
printf("En binario: %b",$number); //"En binario: 11111111"
printf("%.2s\n", "patata"); // pa
printf("%.4s\n", "patata"); // pata
printf("*%9.4s\n", "patata"); // pata Total 9 caracteres, resto espacios
printf("*%9s\n", "patata"); // patata. El resto hasta 9 caracteres
// lo rellena con espacios
printf("%-9s*\n", "patata"); // patata. El resto hasta 9 caracteres
// lo rellena con espacios a la izquierda
printf("%09s\n", "patata"); // patata. El resto hasta 9 caracteres
// lo rellena con ceros
printf("%'x9s\n", "patata"); // patata. El resto hasta 9 caracteres
// lo rellena con x (fijate en la comilla
// simple)
?>
pa pata * pata * patata patata * 000patata xxxpatata
Rendimiento
printf y sprintf deben usarse solo cuando tengamos que dar formato especial al texto, no con carácter general, ya que es mas lento que echo o print.
Entre echo o print no hay diferencias significativas. Interiormente echo es una construcción del lenguaje que vuelca texto en pantalla, mientras que print es una función, que por tanto devuelve verdadero o falso al tiempo de ejecución, lo que puede tener alguna utilidad.
No parece que exista ninguna diferencia sustancial de velocidad entre echo y print por lo que en situaciones normales escoger una u otra será cuestión de gustos.
echo admite varios argumentos, y print no, asi que:
<?php
echo "hola"," amigo"; // vuelca "hola amigo"
print "hola", " amigo" // da error
?>
Nota que en el ejemplo anterior, echo vuelca las dos cadenas, pero no las suma, siguen siendo dos cadenas. Si queremos concatenar cadenas para tratarlas como una sola, debemos usar el signo “.”

