Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.
(PHP 4, PHP 5, PHP 7, PHP 8)
printf — Muestra una string formateada
format
La cadena de formato está compuesta por cero o más directivas:
caracteres ordinarios (excepto %
)
que se copian directamente al resultado y
especificaciones de conversión,
cada una con su propio parámetro.
Una especificación de conversión que sigue este prototipo:
%[argnum$][flags][width][.precision]specifier
.
Un entero seguido de un signo dólar $
,
para especificar qué número de argumento tratar en la conversión.
Bandera | Descripción |
---|---|
- |
Justifica el texto a la izquierda dado el ancho del campo; la justificación a la derecha es el comportamiento por omisión. |
+ |
Prefija los números positivos con un signo más
+ ; por omisión solo los números
negativos son prefijados con un signo negativo.
|
(espacio) |
Rellena el resultado con espacios. Esto es por omisión. |
0 |
Rellena solo los números a la izquierda con ceros.
Con el especificador s esto también puede
rellenar a la derecha con ceros.
|
' (char) |
Rellena el resultado con el carácter (char). |
Sea un entero indicando el número de caracteres (mínimo)
que esta conversión debe producir, o *
.
Si *
es utilizado, entonces el ancho es proporcionado
como un valor entero adicional precediendo al que se formatea
por el especificador.
Un punto .
seguido opcionalmente
sea de un entero, o de *
,
cuya significación depende del especificador:
e
, E
,
f
y F
:
esto es el número de dígitos a mostrar después
de la coma (por omisión, esto es 6).
g
, G
,
h
y H
:
esto es el número máximo de dígitos significativos a mostrar.
s
: actúa como un punto de corte,
definiendo un límite máximo de caracteres de la cadena.
Nota: Si el punto es especificado sin un valor explícito para la precisión, 0 es asumido. Si
*
es utilizado, la precisión es proporcionada como un valor entero adicional precediendo al que se formatea por el especificador.
Especificador | Descripción |
---|---|
% |
Un carácter de porcentaje literal. No se necesita ningún argumento. |
b |
El argumento es tratado como un entero y presentado como un número binario. |
c |
El argumento es tratado como un entero y presentado como el carácter de código ASCII correspondiente. |
d |
El argumento es tratado como un entero y presentado como un número entero decimal (firmado). |
e |
El argumento es tratado como una notación científica
(ej. 1.2e+2 ).
|
E |
Como el especificador e pero utiliza
una letra mayúscula (por ejemplo 1.2E+2).
|
f |
El argumento es tratado como un número de coma flotante (tipo número decimal) y presentado como un número de coma flotante (teniendo en cuenta la configuración local). |
F |
El argumento es tratado como un número de coma flotante (tipo número decimal) y presentado como un número de coma flotante (sin tener en cuenta la configuración local). |
g |
Formato general. Sea P igual a la precisión si diferente de 0, 6 si la precisión es omitida o 1 si la precisión es cero. Entonces, si la conversión con el estilo E tuviera como exponente X: Si P > X ≥ −4, la conversión es con estilo f y precisión P − (X + 1). De lo contrario, la conversión es con el estilo e y precisión P - 1. |
G |
Como el especificador g pero utiliza
E y f .
|
h |
Como el especificador g pero utiliza F .
Disponible a partir de PHP 8.0.0.
|
H |
Como el especificador g pero utiliza
E y F . Disponible a partir de PHP 8.0.0.
|
o |
El argumento es tratado como un entero y presentado como un número octal. |
s |
El argumento es tratado y presentado como una cadena de caracteres. |
u |
El argumento es tratado como un entero y presentado como un número decimal no firmado. |
x |
El argumento es tratado como un entero y presentado como un número hexadecimal (las letras en minúsculas). |
X |
El argumento es tratado como un entero y presentado como un número hexadecimal (las letras en mayúsculas). |
El especificador de tipo c
ignora el alineamiento y el tamaño.
Intentar utilizar una combinación de una cadena y especificadores con juegos de caracteres que necesitan más de un octeto por carácter dará un resultado inesperado.
Las variables serán forzadas a un tipo apropiado para el especificador:
Tipo | Especificadores |
---|---|
string | s |
int |
d ,
u ,
c ,
o ,
x ,
X ,
b
|
float |
e ,
E ,
f ,
F ,
g ,
G ,
h ,
H
|
values
Devuelve la longitud de la string mostrada.
A partir de PHP 8.0.0, se lanza una ValueError si el número de argumentos es nulo.
Anterior a PHP 8.0.0, se emitía un E_WARNING
en su lugar.
A partir de PHP 8.0.0, se lanza una ValueError si [width]
es inferior a cero o superior a PHP_INT_MAX
.
Anterior a PHP 8.0.0, se emitía un E_WARNING
en su lugar.
A partir de PHP 8.0.0, se lanza una ValueError si [precision]
es inferior a cero o superior a PHP_INT_MAX
.
Anterior a PHP 8.0.0, se emitía un E_WARNING
en su lugar.
A partir de PHP 8.0.0, se lanza una ArgumentCountError cuando se proporcionan menos argumentos de los requeridos.
Anterior a PHP 8.0.0, se devolvía false
y se emitía un E_WARNING
en su lugar.
Versión | Descripción |
---|---|
8.0.0 |
Esta función ya no devuelve false en caso de fallo.
|
8.0.0 |
Lanza una ValueError si el número de argumentos es cero;
anteriormente, esta función emitía un E_WARNING .
|
8.0.0 |
Lanza una ValueError si [width] es inferior a cero o superior a PHP_INT_MAX ;
anteriormente, esta función emitía un E_WARNING .
|
8.0.0 |
Lanza una ValueError si [precision] es inferior a cero o superior a PHP_INT_MAX ;
anteriormente, esta función emitía un E_WARNING .
|
8.0.0 |
Lanza una ArgumentCountError cuando se proporcionan menos argumentos de los requeridos;
anteriormente, esta función emitía un E_WARNING .
|
Ejemplo #1 printf(): varios ejemplos
<?php
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 es 'A'
// note el doble %%, esto muestra un carácter '%' literal
printf("%%b = '%b'\n", $n); // representación binaria
printf("%%c = '%c'\n", $c); // muestra el carácter ascii, como la función chr()
printf("%%d = '%d'\n", $n); // representación estándar de un integer
printf("%%e = '%e'\n", $n); // notación científica
printf("%%u = '%u'\n", $n); // representación de integer sin signo de un integer positivo
printf("%%u = '%u'\n", $u); // representación de integer sin signo de un integer negativo
printf("%%f = '%f'\n", $n); // representación en coma flotante
printf("%%o = '%o'\n", $n); // representación octal
printf("%%s = '%s'\n", $n); // representación string
printf("%%x = '%x'\n", $n); // representación hexadecimal (minúscula)
printf("%%X = '%X'\n", $n); // representación hexadecimal (mayúscula)
printf("%%+d = '%+d'\n", $n); // indicación del signo para un integer positivo
printf("%%+d = '%+d'\n", $u); // indicación del signo para un integer negativo
?>
El ejemplo anterior mostrará :
%b = '10100111101010011010101101' %c = 'A' %d = '43951789' %e = '4.39518e+7' %u = '43951789' %u = '4251015507' %f = '43951789.000000' %o = '247523255' %s = '43951789' %x = '29ea6ad' %X = '29EA6AD' %+d = '+43951789' %+d = '-43951789'
Ejemplo #2 printf(): especificadores de strings
<?php
$s = 'monkey';
$t = 'many monkeys';
printf("[%s]\n", $s); // muestra de una string estándar
printf("[%10s]\n", $s); // alineación a la derecha con espacios
printf("[%-10s]\n", $s); // alineación a la izquierda con espacios
printf("[%010s]\n", $s); // el espaciado nulo funciona también en strings
printf("[%'#10s]\n", $s); // uso del carácter personalizado de separación '#'
printf("[%'#*s]\n", 10, $s); // Proporcionar el ancho de alineación como argumento adicional
printf("[%10.9s]\n", $t); // alineación a la derecha pero con corte a 8 caracteres
printf("[%-10.9s]\n", $t); // alineación a la izquierda pero con corte a 8 caracteres
?>
El ejemplo anterior mostrará :
[monkey] [ monkey] [monkey ] [0000monkey] [####monkey] [####monkey] [ many monk] [many monk ]
Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.
[Editor's Note: Or just use vprintf...]
If you want to do something like <?php printf('There is a difference between %s and %s', array('good', 'evil')); ?> (this doesn't work) instead of <?php printf('There is a difference between %s and %s', 'good', 'evil'); ?> you can use this function:
<?php
function printf_array($format, $arr)
{
return call_user_func_array('printf', array_merge((array)$format, $arr));
}
?>
Use it the following way:
<?php
$goodevil = array('good', 'evil');
printf_array('There is a difference between %s and %s', $goodevil);
?>
and it will print:
There is a difference between good and evil
You can use this function to format the decimal places in a number:
$num = 2.12;
printf("%.1f",$num);
prints:
2.1
see also: number_format()
A few things to note about printf:
1. The definition of specifier g (or G) is often wrongly stated as being "use e or f (or E or f), whichever results in the shorter string". The correct rule is given in the documentation and it does not always give this result.
2. For g/G/h/H, trailing zeros after the decimal point are removed (but not a zero just after the decimal point, in the e/E style).
3. g/G are locale-aware whether the e/E or f style is produced.
4. For b/o/x/X/u (that is, all integer styles except d) the result shown for negative values is the twos complement form of the number, 2**32 + v, where v is the (negative) value.