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 — Envia uma string formatada para a saída
Produz uma saída de acordo com o formato definido no parâmetro format
.
format
A string de formato é composta de zero ou mais diretivas:
caracteres comuns (excluindo %
) que são
copiados diretamente para o resultado e especificações
de conversão, cada uma das quais resulta na busca de seu
próprio parâmetro.
Uma especificação de conversão segue este protótipo:
%[argnum$][flags][width][.precision]especificador
.
Um número inteiro seguido por um cifrão $
,
para especificar qual o número de argumento a tratar na conversão.
Flag | Descrição |
---|---|
- |
Justificar à esquerda dentro da largura de campo especificada; A justificação à direita é o padrão. |
+ |
Prefixa números positivos com um sinal de mais
+ ; Por padrão, apenas números negativos
são prefixados com um sinal negativo.
|
(espaço) |
Preenche o resultado com espaços. Este é o padrão. |
0 |
Preenche números com zeros apenas à esquerda.
Com os especificadores s , também pode
preencher com zeros à direita.
|
' (char) |
Preenche o resultado com o caractere (char). |
Um número inteiro que define em quantos caracteres (mínimo)
esta conversão deve resultar, ou *
.
Se *
for usado, a largura será fornecida
como um valor inteiro adicional precedendo aquele formatado
pelo especificador.
Um ponto .
opcionalmente seguido por
um número inteiro ou *
,
cujo significado depende do especificador:
e
, E
,
f
e F
:
este é o número de dígitos a serem impressos
após o ponto decimal (por padrão, é 6).
g
, G
,
h
e H
:
este é o número máximo de dígitos
significativos a serem impressos.
s
: atua como um ponto de corte,
definindo um limite máximo de caracteres para a string.
Nota: Se o ponto for especificado sem um valor explícito para precisão, 0 é assumido. Se
*
for usado, a precisão é fornecida como um valor inteiro adicional precedendo aquele formatado pelo especificador.
Especificador | Descrição |
---|---|
% |
Um caractere literal de porcentagem. Nenhum argumento é necessário. |
b |
O argumento é tratado como um número inteiro e apresentado como um número binário. |
c |
O argumento é tratado como um número inteiro e apresentado como o caractere com aquele código ASCII. |
d |
O argumento é tratado como um número inteiro e apresentado como um número decimal (com sinal). |
e |
O argumento é tratado como notação científica (por exemplo, 1.2e+2). |
E |
Como o especificador e , mas usa
letra maiúscula (por exemplo, 1.2E+2).
|
f |
O argumento é tratado como um float e apresentado como um número de ponto flutuante (com reconhecimento da localidade). |
F |
O argumento é tratado como um float e apresentado como um número de ponto flutuante (sem reconhecimento da localidade). |
g |
Formato geral. Deixa P igual à precisão se for diferente de zero, 6 se a precisão for omitida, ou 1 se a precisão for zero. Então, se uma conversão com estilo E tivesse um expoente de X: Se P > X ≥ −4, a conversão é com estilo f e precisão P − (X + 1). Caso contrário, a conversão é com estilo e e precisão P − 1. |
G |
Como o especificador g , mas usa
E e f .
|
h |
Como o especificador g , mas usa F .
Disponível a partir do PHP 8.0.0.
|
H |
Como o especificador g , mas usa
E e F . Disponível a partir do PHP 8.0.0.
|
o |
O argumento é tratado como um número inteiro e apresentado como um número octal. |
s |
O argumento é tratado e apresentado como uma string. |
u |
O argumento é tratado como um número inteiro e apresentado como um número decimal sem sinal. |
x |
O argumento é tratado como um número inteiro e apresentado como um número hexadecimal (com letras minúsculas). |
X |
O argumento é tratado como um número inteiro e apresentado como um número hexadecimal (com letras maiúsculas). |
O especificador de tipo c
ignora preenchimento e largura.
Tentar usar uma combinação dos especificadores de string e largura com conjuntos de caracteres que requerem mais de um byte por caractere pode resultar em resultados inesperados.
As variáveis serão forçadas a um tipo adequado para o especificador:
Tipo | Especificadores |
---|---|
string | s |
int |
d ,
u ,
c ,
o ,
x ,
X ,
b
|
float |
e ,
E ,
f ,
F ,
g ,
G ,
h ,
H
|
values
Retorna o comprimento da string enviada para a saída.
A partir do PHP 8.0.0, um erro ValueError será lançado se o número de argumentos for zero.
Antes do PHP 8.0.0, um E_WARNING
era emitido.
A partir do PHP 8.0.0, um erro ValueError será lançado se [width]
for menor que zero ou maior que PHP_INT_MAX
.
Antes do PHP 8.0.0, um E_WARNING
era emitido.
A partir do PHP 8.0.0, um erro ValueError será lançado se [precision]
for menor que zero ou maior que PHP_INT_MAX
.
Antes do PHP 8.0.0, um E_WARNING
era emitido.
A partir do PHP 8.0.0, um erro ArgumentCountError será lançado quando menos argumentos do que o necessário forem fornecidos.
Antes do PHP 8.0.0, false
era retornado e um E_WARNING
era emitido.
Versão | Descrição |
---|---|
8.0.0 |
Esta função não retorna mais false em caso de falha.
|
8.0.0 |
Lança um erro ValueError se o número de argumentos for zero;
anteriormente, esta função emitia um E_WARNING .
|
8.0.0 |
Lança um erro ValueError se [width] for menor que zero ou maior que PHP_INT_MAX ;
anteriormente, esta função emitia um E_WARNING .
|
8.0.0 |
Lança um erro ValueError se [precision] for menor que zero ou maior que PHP_INT_MAX ;
anteriormente, esta função emitia um E_WARNING .
|
8.0.0 |
Lança um erro ArgumentCountError quando menos argumentos do que o necessário são fornecidos;
anteriormente, esta função emitia um E_WARNING .
|
Exemplo #1 printf(): vários exemplos
<?php
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 é 'A'
// observe o duplo %%, isto mostra um caractere '%' literal
printf("%%b = '%b'\n", $n); // representação binária
printf("%%c = '%c'\n", $c); // mostra o caractere ASCII, o mesmo que a função chr() faz
printf("%%d = '%d'\n", $n); // representação padrão de número inteiro
printf("%%e = '%e'\n", $n); // notação científica
printf("%%u = '%u'\n", $n); // representação de inteiro sem sinal de um inteiro positivo
printf("%%u = '%u'\n", $u); // representação de inteiro sem sinal de um inteiro negativo
printf("%%f = '%f'\n", $n); // representação em ponto flutuante
printf("%%o = '%o'\n", $n); // representação em octal
printf("%%s = '%s'\n", $n); // representação em string
printf("%%x = '%x'\n", $n); // representação em hexadecimal (minúsculas)
printf("%%X = '%X'\n", $n); // representação em hexadecimal (maiúsculas)
printf("%%+d = '%+d'\n", $n); // especificador de sinal em um inteiro positivo
printf("%%+d = '%+d'\n", $u); // especificador de sinal em um inteiro negativo
?>
O exemplo acima produzirá:
%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'
Exemplo #2 printf(): especificadores de string
<?php
$s = 'monkey';
$t = 'many monkeys';
printf("[%s]\n", $s); // saída padrão de string
printf("[%10s]\n", $s); // alinhamento à direita com espaços
printf("[%-10s]\n", $s); // alinhamento à esquerda com espaços
printf("[%010s]\n", $s); // preenchimento com zeros funciona em strings também
printf("[%'#10s]\n", $s); // usa o caractere customizado de preenchimento '#'
printf("[%'#*s]\n", 10, $s); // fornece a largura de preenchimento como um argumento adicional
printf("[%10.9s]\n", $t); // alinhamento à direita com corte de 8 caracteres
printf("[%-10.9s]\n", $t); // alinhamento à esquerda com corte de 8 caracteres
?>
O exemplo acima produzirá:
[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
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.
To provide a more user-friendly interface, you can use colors when printing text in the terminal.
p('Ordinary text.');
p('Warning: Check this out...', 'info');
p('Ops! Something went wrong.', 'error');
p('Yeah... done!', 'success');
function p($text, $style = '', $newLine = true) {
$styles = array(
'success' => "\033[0;32m%s\033[0m",
'error' => "\033[31;31m%s\033[0m",
'info' => "\033[33;33m%s\033[0m",
'Black' => "\033[0;30m%s\033[0m",
'Red' => "\033[0;31m%s\033[0m",
'Green' => "\033[0;32m%s\033[0m",
'Yellow' => "\033[0;33m%s\033[0m",
'Blue' => "\033[0;34m%s\033[0m",
'Purple' => "\033[0;35m%s\033[0m",
'Cyan' => "\033[0;36m%s\033[0m",
'Gray' => "\033[0;37m%s\033[0m",
'Graphite' => "\033[1;30m%s\033[0m",
'Bold Red' => "\033[1;31m%s\033[0m",
'Bold Green' => "\033[1;32m%s\033[0m",
'Bold Yellow' => "\033[1;33m%s\033[0m",
'Bold Blue' => "\033[1;34m%s\033[0m",
'Bold Purple' => "\033[1;35m%s\033[0m",
'Bold Cyan' => "\033[1;36m%s\033[0m",
'Bold White' => "\033[1;37m%s\033[0m",
'Bg Black' => "\033[40;1;37m%s\033[0m",
'Bg Red' => "\033[41;1;37m%s\033[0m",
'Bg Green' => "\033[42;1;37m%s\033[0m",
'Bg Yellow' => "\033[43;1;37m%s\033[0m",
'Bg Blue' => "\033[44;1;37m%s\033[0m",
'Bg Purple' => "\033[45;1;37m%s\033[0m",
'Bg Cyan' => "\033[46;1;37m%s\033[0m",
'Bg Gray' => "\033[47;1;37m%s\033[0m",
'Underscore' => "\033[4;37m%s\033[0m",
'Inverted' => "\033[7;37m%s\033[0m",
'Blink' => "\033[5;37m%s\033[0m",
);
$format = '%s';
if (isset($styles[$style])) {
$format = $styles[$style];
}
if ($newLine) {
$format .= PHP_EOL;
}
printf($format, $text);
}
instead of writing a function to round off a float (let's call it 'x') accurately, it's much easier to add a small number to x and then truncate it...
For example: if you want to round off to the nearest integer, just add 0.5 to x and then truncate it. if x=12.6, then it would calculate 13.1, and truncate it to 13. If x=14.4, it would calculate 14.9 and truncate it to 14.
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()
To format a dollar value as in $123.00 that may otherwise look like $123 use this
print ('$'); // the dollar sign in front of our answer
printf ('%.2f',$price);