Ao desenvolver aplicações web em PHP, é comum a necessidade de formatar valores numéricos para exibição, especialmente quando se trata de preços, montantes monetários ou qualquer dado que exija uma apresentação padronizada. Isso envolve definir o número correto de casas decimais e aplicar separadores de milhar e decimal conforme o padrão cultural local (por exemplo, vírgula para decimais e ponto para milhares no Brasil).
A função principal para realizar essa tarefa em PHP é number_format(), que converte um valor numérico em uma string formatada para leitura humana.
A Função number_format()
A função number_format() é projetada para formatar um número para uma representação em string. Sua assinatura completa é:
string number_format ( float $numero , int $casas_decimais = 0 , string $separador_decimal = "." , string $separador_milhar = "," )
Parâmetros:
$numero(obrigatório): O valor numérico (floatouint) a ser formatado.$casas_decimais(opcional): Um número inteiro que especifica quantas casas decimais devem ser exibidas. Se omitido, o número será formatado sem casas decimais, mas com o separador de milhar padrão.$separador_decimal(opcional): O caractere a ser usado como sepraador para a parte decimal. O padrão é.(ponto). Para o padrão brasileiro, utiliza-se,(vírgula).$separador_milhar(opcional): O caractere a ser usado para separar os milhares. O padrão é,(vírgula). Para o padrão brasileiro, utiliza-se.(ponto).
É possível chamar number_format() com um, dois ou quatro parâmetros. Não é possível usá-la com três parâmetros, pois o terceiro e quarto parâmetros estão intrinsecamente ligados à personalização dos separadores.
Comportamento de Arredondamento:
É impotrante ressaltar que number_format(), ao aplicar o parâmetro $casas_decimais, realiza um arredondamento no último dígito decimal visível, e não apenas truncagem. Por exemplo, number_format(12.345, 2) resultará em "12.35". Se um comportamento de truncagem ou um tipo específico de arredondamento (como arredondamento para cima ou para baixo) for necessário, a função round() deve ser aplicada ao número *antes* de passá-lo para number_format().
Exemplos Práticos de Formatação com number_format()
Vamos explorar alguns cenários comuns de formatação para entender melhor o uso da função:
<?php
$valorProduto = 12345.6789;
$precoUnitario = 49.9;
$faturaTotal = 9999.995;
$numeroGrande = 1000000;
echo "<h4>1. Formatação Padrão (Inglês/Americano)</h4>";
echo "Valor original: " . $valorProduto . "<br>";
// Apenas o número, sem casas decimais, separador de milhar padrão (,)
echo "Sem casas decimais: " . number_format($numeroGrande) . "<br>"; // Saída: 1,000,000
// Com 2 casas decimais, separador de milhar padrão (,), separador decimal padrão (.)
echo "Com 2 casas decimais: " . number_format($valorProduto, 2) . "<br>"; // Saída: 12,345.68
echo "<h4>2. Formatação para o Padrão Monetário Brasileiro (BRL)</h4>";
// Utilizando vírgula para decimal e ponto para milhar
$formatadoBRL1 = number_format($precoUnitario, 2, ',', '.');
echo "Preço (49.9) formatado para BRL: R$ " . $formatadoBRL1 . "<br>"; // Saída: R$ 49,90
$formatadoBRL2 = number_format($valorProduto, 2, ',', '.');
echo "Valor maior (12345.6789) formatado para BRL: R$ " . $formatadoBRL2 . "<br>"; // Saída: R$ 12.345,68
echo "<h4>3. Controle de Arredondamento com round()</h4>";
echo "Fatura Total original: " . $faturaTotal . "<br>"; // Saída: 9999.995
// Formatação direta por number_format (arredondamento padrão para 2 casas)
echo "Formatação direta (9999.995): R$ " . number_format($faturaTotal, 2, ',', '.') . "<br>"; // Saída: R$ 10.000,00
// Forçando arredondamento para baixo antes de formatar
$valorArredondadoBaixo = round($faturaTotal, 2, PHP_ROUND_HALF_DOWN);
echo "Arredondado para baixo e formatado: R$ " . number_format($valorArredondadoBaixo, 2, ',', '.') . "<br>"; // Saída: R$ 9.999,99
// Forçando arredondamento para cima antes de formatar
$valorArredondadoCima = round($faturaTotal, 2, PHP_ROUND_HALF_UP);
echo "Arredondado para cima e formatado: R$ " . number_format($valorArredondadoCima, 2, ',', '.') . "<br>"; // Saída: R$ 10.000,00
echo "<h4>4. Personalizando Separadores</h4>";
$valorPersonalizado = 54321.98;
echo "Decimal com '&', milhar com '#': " . number_format($valorPersonalizado, 2, '&', '#') . "<br>"; // Saída: 54#321&98
// Sem separador de milhar
echo "Sem separador de milhar: " . number_format($valorPersonalizado, 2, ',', '') . "<br>"; // Saída: 54321,98
?>
A saída esperada para os exemplos acima seria:
<h4>1. Formatação Padrão (Inglês/Americano)</h4>
Valor original: 12345.6789
Sem casas decimais: 1,000,000
Com 2 casas decimais: 12,345.68
<h4>2. Formatação para o Padrão Monetário Brasileiro (BRL)</h4>
Preço (49.9) formatado para BRL: R$ 49,90
Valor maior (12345.6789) formatado para BRL: R$ 12.345,68
<h4>3. Controle de Arredondamento com round()</h4>
Fatura Total original: 9999.995
Formatação direta (9999.995): R$ 10.000,00
Arredondado para baixo e formatado: R$ 9.999,99
Arredondado para cima e formatado: R$ 10.000,00
<h4>4. Personalizando Separadores</h4>
Decimal com '&', milhar com '#': 54#321&98
Sem separador de milhar: 54321,98
Atenção: Valores Formatados São Strings!
É fundamental lembrar que number_format() retorna uma *string*. Tentar usar essa string diretamente em operações matemáticas subsequentes em PHP pode levar a resultados inesperados ou erros. PHP tentará converter a string em um número, mas caracteres como separadores de milhar (ponto, vírgula, etc.) interromperão essa conversão, fazendo com que apenas a parte numérica inicial seja considerada.
Por exemplo, se você tiver a string "R$ 1.234,56" e tentar adicioná-la a outro número, PHP pode interpretar apenas o "1" (antes do separador de milhar) ou gerar um aviso, dependendo da configuração. A regra de ouro é: realize *todas* as operações matemáticas nos valores *numéricos originais* (float ou int) e use number_format() apenas no final, para apresentar o resultado formatado ao usuário.