Como formatar Strings e números em PHP
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.
Placeholder | Descrição |
%% | um caractere % literal. Nenhum argumento é necessário |
%b | O argumento é tratado como um inteiro e representado como um número binário. |
%c | O argumento é tratado como um inteiro e representado como um caractere de valor ASCII |
%d | O argumento é tratado como um inteiro e representado como um número decimal com sinal |
%e | O argumento é tratado como notação cientifica(p.e. 1.2e+2). |
%E | O mesmo que %e mas com o ‘E’ em caixa alta. |
%f | O argumento é tratado como um float e representado como um número em ponto flutuante levando em conta o locale. |
%F | O argumento é tratado como um float e representado como um número em ponto flutuante não levando em conta o locale. |
%o | O argumento é tratado como um inteiro e representado como um número octal. |
%s | O argumento é tratado e representado como uma string. |
%u | O argumento é tratado como um inteiro e representado como um número decimal sem sinal. |
%x | O argumento é tratado como um inteiro e representado como um número hexadecimal como as letras em caixa baixa. |
%X | O 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. |
0 | Preenche 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++