Skip to content

Instantly share code, notes, and snippets.

@jackmakiyama
Last active November 11, 2016 16:49
Show Gist options
  • Save jackmakiyama/ad61b5dc17300619fc5a09bff769d710 to your computer and use it in GitHub Desktop.
Save jackmakiyama/ad61b5dc17300619fc5a09bff769d710 to your computer and use it in GitHub Desktop.

Manipulando números com a classe NumberFormatter

Trabalhar com números é muito comum em nossa área e em algum momento de nossa jornada vamos pegar uma aplicação marota que será necessário uma alta manipulação de números, moedas ou até mesmo escrever um numero safado por extenso.

O PHP em si tem uma penca de funções que ajuda a tratar isso, apesar de serem rápidos são bem chatas de se lembrar nomes e ter que fazer nós mesmo certas lógicas. Eu sempre achei isso um saco, pois não faz muito sentido termos que ficar definindo um monte de lógicas que alguma lib poderia fazer.

Pois bem, depois de anos fazendo isso no braço sempre que precisei, me deparo com a classe NumberFormatter que acompanha a extensão intl.

Algo que está documentado e por um acaso passou batido por mim e pelo jeito muitos ainda a desconhecem.

Assim como aconteceu quando conheci DateTime a NumberFormatter deu um boom na minha cabeça, mesmo quase 10 anos depois do seu lançamento.

Bom, vamos dar uma olhada na forma que geralmente encontramos em exemplos com o number_format:

<?php

$number = 7683425876.122134;

echo 'R$' . number_format($number, 2, ',', '.');
// R$7.683.425.876,12

O mesmo exemplo usando a classe NumberFormatter:

<?php

$number = 7683425876.122134;

$numberFormatted = new \NumberFormatter("pt-BR", \NumberFormatter::CURRENCY);

echo $numberFormatted->format($number);
// R$7.683.425.876,12

Vejam que apesar de um mesmo resultado não temos a preocupação de como devemos formatar ou se estando formatando certo.

Para instanciar um objeto basta definir os atributos locale e style. O style são um conjunto de constantes que indica o que vai ser feito, no nossa caso uma conversão monetária para o locale pt-BR.

O conjunto de constantes que definem um style praticamente cobre todas as funções nativas do PHP que tratam números.

A vantagem aqui é que fica muito mais legível e simples o código.

Agora pensa em um trampo se precisássemos converter números gregos em suas versões escritas por extenso. Pois é seria um trabalho grande ou até precisaríamos de uma lib de terceiros para não reinventar a roda.

Então vejamos com o NumberFormatter:

<?php

$number = 7683425876.122134;

$numberFormatted = new NumberFormatter("pt-BR", NumberFormatter::SPELLOUT);

echo $numberFormatted->format($number);
// sete bilhões e seiscentos e oitenta e três milhões e quatrocentos e vinte e cinco mil e oitocentos e setenta e seis vírgula um dois dois um três

Bem louco né?

E aí, gostou? Conhecia a classe? Conhece mais alguma classe marota do PHP?

Obrigado e até a próxima... o/

@jackmakiyama
Copy link
Author

@Diego-Brocanelli
Copy link

Diego-Brocanelli commented Jun 11, 2016

Sim o PHP tem um oceano de funções, classes entre outros recursos nativos que poupam muito esforço e tempo :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment