PHP

Como formatar números com PHP

Por em

No post passado, mencionei como formatar datas em PHP orientado a objetos. Pois, com números, há também as maneiras procedurais e orientadas a objetos, e esta é outra questão que às vezes tiram a paciência de muitos desenvolvedores.

Qual é a ideia?

Usar o NumberFormatter para formatar números. Ele surgiu na versão PHP 5.3 e ainda tem muitos desenvolvedores experientes que não o conhecem. Para usa-lo é necessário também ativar no seu php.ini, a extensão intl. Se você está usando hospedagem compartilhadas, ou algo do tipo, contacte seu provedor de hospedagem sobre a disponibilidade do intl, se o provedor não tiver e/ou não puder instalar, cuidado! Encontre outro provedor que a ofereça, porque o intl é hoje uma extensão básica para normalização e padronização de dados entre vários idiomas, um provedor que se prese tem que o oferecer, senão, estará oferecendo um suporte defasado.

O que faremos?

  1. Brincar com o NumberFormatter
  2. Considerações finais. 

Passos

  1. Brincar com o NumberFormatter.

Para mostrar um número no formato brasileiro:

$numberFormatter = new \NumberFormatter('pt-BR',\NumberFormatter::CURRENCY); 
echo $numberFormatter->format(1234.12);
// isto criará um numberformatter e mostrará o número no formato brasileiro com um R$ na frente.

Basicamente o NumberFormatter precisa da localidade que queremos trabalhar (pt-BR, de_DE, en_US) e o tipo de formato do número (decimal, moeda, científico, percentual).

Para mostrar um número no formato brasileiro de percentual (usando método stático para criar o NumberFormatter):

echo \NumberFormatter::create('pt_BR',\NumberFormatter::PERCENT)->format(0.1); 
//lembrando que o tipo PERCENT multiplicará o número por 100 para normalizar para 100%. Então mostrará 10%.

Com NumberFormatter você pode determinar o número de casas decimais a ser formatado:

$numberFormatter->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2); 
//com o setAttribute você pode mudar inúmeras propriedades que alterará o número a ser mostrado

Outra funcionalidade legal é a possibilidade de criar um formato via expressão regular:

$numberFormat->setPattern("#0.# m"); 
//pedi para que não seja mostrado a casa de milhar e como sufixo a letra m

Agora você pega e se pergunta, mas como eu faço para transformar um número localizado, ou seja, no formato de um país para número habitual do PHP. É simples! É só usar o método parse:

echo $numberFormatter->parse("1.234,12"); 
//como o número é brasileiro, o numberformatter tem que ser iniciado com um 'pt-BR' e configurado devidamente

O método consegue reverter o número localizado no devido formato com qualquer sufixo, etc, mas, é preciso criar o NumberFormatter com os atributos necessários para que ele reconheça o número localizado, senão, ele não conseguirá transformar e retornará false.

  1. Considerações finais

É isso aí pessoal, como brincaram com o DateTime, espero que brinquem também com o NumberFormatter. Vejam que se trabalhar com códigos orientados a objetos e estruturados, melhora e muito a qualidade do nosso código e também a qualidade das nossas aplicações. Parem de ficar fazendo gambiarras para transformar números, de ficar tentando “reinventar a roda”, ela já está pronta, testada e aprovada, basta usa-la devidamente.

Referências:

http://php.net/manual/pt_BR/class.numberformatter.php