Formatar moedas ou números decimais com a função number_format() do PHP

A função number_format() do PHP, além de trocar ponto(.) por vírgula(,), também serve para definir quantas casas decimais teremos no valor.

O número que é em Inglês 999.9 fica 999,90 no formato moeda brasileiro.
Além disso, podemos definir se irá exibir algum caracter a cada grupo de milhar(de mil em mil)

string number_format ( float $number, int $decimals, string $dec_point, string $thousands_sep )

podemos definir por:
valor texto number_format($valor_decimal, $casas_decimais,$caracter_definicao_decimal, $caracter_definicao_milhar)


Por exemplo, se quisermos que o número 1000 fique como 1.000, utilizamos a função desta maneira:

$valor = 1000;
echo number_format($valor,0,",",".");

Agora se quisermos que o valor 1,000.9(em formato inglês) tenha o formato 1.000,90(brasileiro), utilize:

$valor = 1,000.9;
echo number_format($valor,2,",",".");

Se não quiser que tenha o ponto(.) entre as casas de milhar, deixe com o última parâmetro vazio:

$valor = 1000.9;
echo number_format($valor,2,",","");

Existe uma maneira gambiarra para formatar número que eu não aconselho a utilizar. Seria algo do tipo:

$valor = 100.9
echo str_replace(".",",",$valor);

17 ideias sobre “Formatar moedas ou números decimais com a função number_format() do PHP

  1. Pingback: Formatando números com a função number_format() « <?PHProgrammer

  2. Pingback: Formatar números com a função number_format() : FernandoMoreira - Webdesigner e Programador

  3. Já tentei sim e não dá certo. Acabei pensado em outra função, a substr(). Assim eu divido a string em mais strings e depois junto tudo novamente colocando a vírgula. Usando valor negativo inverte-se o ponto de início (substr($v,-2)). A outra parte eu uso strlen() e subtraio duas posições de seu resultado. Isso só para a vírgula ficar no lugar certo. Quanto aos pontos… bem alguns ifs baseados no tamanho da string resolve.
    Não é a maneira mais prática mas resolveu meu problema. Se eu achar algo melhor, é claro que posto aqui com prazer. Muito obrigado pela atenção. Abraço e boa sorte!

    • Be… enquanto não acho algo próprio para resolver esta questão, vou usar esta função que criei.
      Tudo porque eu preciso deixar a digitação em texto para o cliente obedecer a escrita em português. Não quero usar javascript para fazer uma máscara, já que não é em todos os computador que vai funcionar. E o campo no banco de dados é inteiro (para manter os centavos, real estava dando erro), assim eu consigo inserir uma "string" em um campo numérico. Não é o mais bonito mas funciona e o cliente está satisfeito e eu prefiro usar só php. Segue o código da função:

      <?php function em_real($campo){
      // limpar valor texto 1.500.000,59 em inteiro e depois em real formatado
      $vi = trim( $campo);
      $vi = str_replace(".","",$vi); $vi = str_replace(",","",$vi);

      $comp = strlen($vi);

      $v0 = substr($vi,-2); // centavos
      $vv = substr($vi,0, $comp-2); // milares

      return $valor_real = number_format($vv,0,",",".").",". $v0; // formato final
      }
      ?>

      • Alexandre, desculpe a demora, mas acho que divindo por 100 e usando o number_format você tem um resultado mais rápido e mais confiável do que trabalhar com strings!

        Abs e desculpe a demora!

  4. O problema dessa função é que ela é pensada na forma americana de escrita. Imagine algo como um valor Real fosse digitado assim: 125000048 , sem ponto e sem vírgula. Como resolver isso com esta função? impossível, pois retornaria 125.000.048,00 sendo que a intenção era 1.250.000,48. Alguém sabe como resolver isso?
    Boa sorte com o blog e obrigado!

    • ex.:
      $valor = 150;
      echo number_format($valor,2,",",".");

      vai retornar 150,00

      ex&sup2;.:
      $valor = 150.25;
      echo number_format($valor,2,",",".");

      vai retornar 150,25

      • Bem, o problema é quando se digita 15025 (sem o ponto ou vírgula). Esse era o meu problema, o cliente queria digitar direto, sem formatação alguma. Vai entender né!?!
        Mas valeu a boa vontade Pedro. Isso que você menciona está no texto do próprio post e bem explicado e você só o repetiu. Mas isso não serve para o caso de números onde não se coloca ponto ou vírgula mas mesmo assim existe o centavos. Como eu mencionei lá em cima, o 15025 (cento e cinquenta reais e vinte e cinco centavos). Abraço.

          • Olá Leo, não se preocupe quanto a possíveis demora. O que vale é a boa vontade e… imagine só, você está certo: dividir por 100, funcionou! Éra exatamente o que eu precisava e sem nenhuma linha à mais… Agora só tenho um probleminha… hehehe… vou ter de jogar minha função fora hahahaha!!!!
            E pode acreditar que sempre estarei dando uma consultada no seu site.
            Abração e boa sorte!

          • Magina! Sempre que posso tento ajudar todo mundo rsrs!

            Então, na programação é assim. Existem milhares de caminhos para percorrer! O que importa é o resultado final!

            A sua função funcionou, então ta valendo rsrs!

            Tenho um colega de trabalho que diz sempre assim: \”Existe o jeito certo e o que funciona\”

            Você até pode jogar sua função \”fora\”. Mas de qualquer maneira, este problema fez você pensar e pensar e pensar. E esse é o objetivo do programador. Resolver problemas!

            Abs e espero postar mais em breve! Boa sorte pra ti também!

    • ai é um erro de digitação. Aprendemos na escola, se no numero que digitamos não tem ponto nem virgula, ele todo é um inteiro, se vc digita isso 125000048 vc quer isso 125.000.048,00 é a mesma coisa. se vc quer q saia isso 1.250.000,48 deve digitar isso 1250000.48 ou 1250000,48. vc é quem apresenta os decimais para qualquer programa, ate a calculadora.

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>