Nem sempre os dados que temos armazenados estão no formato em que os usuários devem visualizar, nestes casos formatar a saída se faz necessário. No PHP temos algumas funções para este fim como a printf e number_format.

A função printf exibe uma string formatada, para isto ela utiliza placeholders(marcadores de posição) em uma string maior e os substitui por valores passados como argumento formatando-os conforme especificado no próprio placeholder. Uma string a ser formatada pode ter diversos placeholders e para cada um deve ser passado um argumento. Veja um exemplo.

$value = 12310.5;
printf("O Valor é: %f", $value);

// Saída
// O Valor é: 12310.500000

$idade = 35;
$altura = 1.78;
printf("Idade %d - Altura: %f", $idade, $altura);

// Saída
// Idade 35 - Altura: 1.780000

Existem diversos placeholders para diversos tipos de dados e formatos de saída, mas sempre começam com um caractere de ‘%’ seguido de uma letra considerada o especificador.

PlaceholderDescrição
%%um caractere % literal. Nenhum argumento é necessário
%bO argumento é tratado como um inteiro e representado como um número binário.
%cO argumento é tratado como um inteiro e representado como um caractere de valor ASCII
%dO argumento é tratado como um inteiro e representado como um número decimal com sinal
%eO argumento é tratado como notação cientifica(p.e. 1.2e+2).
%EO mesmo que %e mas com o ‘E’ em caixa alta.
%fO argumento é tratado como um float e representado como um número em ponto flutuante levando em conta o locale.
%FO argumento é tratado como um float e representado como um número em ponto flutuante não levando em conta o locale.
%oO argumento é tratado como um inteiro e representado como um número octal.
%sO argumento é tratado e representado como uma string.
%uO argumento é tratado como um inteiro e representado como um número decimal sem sinal.
%xO argumento é tratado como um inteiro e representado como um número hexadecimal como as letras em caixa baixa.
%XO argumento é tratado como um inteiro e representado como um número hexadecimal com as letras em caixa alta.

Veja alguns exemplos dos diversos placeholders:

printf("O Valor é: %b\n", 10);
// Saída: O Valor é: 1010

printf("O Valor é: %c\n", 72);
// Saída: O Valor é: H

printf("O Valor é: %d\n", 72);
// Saída: O Valor é: 72

printf("O Valor é: %e e %E\n", 105.2587, 365.5874);
// Saída: O Valor é: 1.052587e+2 e 3.655874E+2

setlocale(LC_ALL, 'pt_BR.utf-8', );
printf("O Valor é: %f e %F\n", 105.25, 365.58);
// Saída: O Valor é: 105,250000 e 365.580000
// * Note que o primeiro valor utilizou o locale pt-br e o segundo não!

printf("O Valor é: %o\n", 10);
// Saída: O Valor é: 12

printf("O Valor é: %s\n", 'uma string qualquer' );
// Saída: O Valor é: uma string qualquer

printf("O Valor é: %u\n", -10 );
// Saída: O Valor é: 18446744073709551606

printf("O Valor é: %x e %X\n", 154, 154 );
// Saída: O Valor é: 9a e 9A

Ainda podemos colocar valores opcionais nos placeholders entre o caractere de ‘%’ e a letra que representa o formato(especificador). O placeholder segue o seguinte formato %[argnum][width][.precision]specifier onde:

argum: é

-Alinha a esquerda um valor dentro de um width fornecido no placeholder. O alinhamento padrão é a direita, então se quisermos alinhar a esquerda colocamos o ‘-‘ se desejarmos alinhar a direita basta não indicar nada
+Prefixa os números positivos com o sinal de ‘+’. Por padrão somente os numeros negativos são prefixados com o sinal de ‘-‘
(space)Preenche os espaços faltantes do resultado com caracteres de espaço. É o padrão.
0Preenche os espaços faltantes com zeros.
'(char)Preenche os espaços faltantes com o caractere (char).

width: é o número mínimo de caracteres que será utilizado para exibir o valor. Se o valor formatado tiver menos caracteres que o estipulado em width, será adicionado espaços por padrão.

.precision: é o numero de casas decimais que será exibida.

setlocale(LC_ALL, 'pt_BR.utf-8', );
printf("O Valor é: %f\n", 25.123456 );
// Saída: O Valor é: 25,123456

printf("O Valor é: %.2f\n", 25.123456 );
// O Valor é: 25,12

printf("O Valor é: %10.2f\n", 25.123 );
// Saída: O Valor é:      25,12

printf("O Valor é: %-'_10.2f\n", 25.123 );
//Saída: O Valor é: 25,12_____
// Note: exibido um float, de largura de 10 caracteres
// com as casas decimais o caractere de ',' sendo contados,
// alinhado a esquerda( argum '-') e os caracteres faltantes 
// para atingir o total de dez caracteres preenchidos com '_' (argum '_ )

printf("O Valor é: [%'-10s]\n", 'rodrigo' );
// Saída: [---rodrigo]
// Uma string com tamanho de 10 com os caracteres faltantes preenchidos com '-'

A printf possui algumas funções parecidas que funcionam da mesma forma, como:

sprintf: Em vez de exibir um valor formatado ela retorna este valor.

$valor = sprintf('%010.2f', 123.2547);
echo $valor;
//Saída: 0000123,25

fprintf: escreve um valor formatado em um stream.

$stream = fopen('data.txt','w+');
fprintf($stream, '%010.2f', 123.2547);
// o valor 0000123,25 será escrito dentro do arquivo 'data.txt'

As funcões da “familia” printf são utilizadas para realizar a saida de valores formatados. Temos outras funções que realizam a entrada de valores formatados, sendo estas a sscanf e fscanf.

sscanf: realiza a leitura de um string através do formato fornecido no placeholder. Sendo a string de entrada o primeiro argumento e o formato o segundo.

$valor = sscanf("123.25", '%f');
var_dump($valor);
//Saída: 
// array(1) {
//   [0] =>
//  double(123.25)
// }

A função retorna um array porque é possível ler vários valores dentro de uma string

list($dia, $mes, $ano) = sscanf("10/08/2020", '%d/%d/%d');

echo 'Dia: ' . $dia . PHP_EOL;
echo 'Mês: ' . $mes . PHP_EOL;
echo 'Ano: ' . $ano . PHP_EOL;

// Saída:
// Dia: 10
// Mês: 8
// Ano: 2020

fscanf: realiza a leitura de uma stream através do formato fornecido. Sendo a stream de entrada o primeiro argumento e o formato o segundo.

$stream = fopen('data.txt','r');
$valor = fscanf($stream, "%f ; %s");
var_dump($valor);

// Conteúdo do arquivo data.txt
// 123.25 ; Rodrigo
//
// Saída: 
// array(2) {
//   [0] => double(123.25)
//   [1] => string(7) "Rodrigo"
// }

Formatar Números

A função number_format é uma maneira bastante simples de formatar um número, ela não leva em consideração o locale, e por padrão utiliza ponto(.) como divisor de casas decimais e virgula( , ) como divisor de milhar.

$number = 1234.5678;
echo number_format($number) . PHP_EOL;
echo number_format($number, 3) . PHP_EOL;
echo number_format($number, 2, ',', '.') . PHP_EOL;

//Saída:
// 1,235
// 1,234.568
// 1.234,57

Como podemos ver a função number_format aceita três argumentos opcionais, o primeiro é a quantidade de casas decimais que será utilizada, se nenhum for informado o valor padrão é 0, não exibindo nenhuma casa decimal. O segundo parâmetros é o caractere de separador de decimal e o terceiro é o caractere separador de milhar.

Bom era isso espero que tenha sido de alguma ajuda 🙂

T++