BlogBlogs.Com.Br

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

24 de outubro de 2008 por Leo Caseiro

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);

Tags: ,


Gostou do Post? Assine o Feed Assine o Feed RSS




17 Comentários para “Formatar moedas ou números decimais com a função number_format() do PHP”

  1. EDERSON disse:

    $ValorTotal=101524
    $ValorTotal=number_format($ValorTotal,2,'.',',');
    Valor total R$ 1,015.24

  2. [...] aconselho a utilizar. Seria algo do tipo: $valor = 100.9 echo str_replace(".",",",$valor); Fonte: leocaseiro.com.br Share this:TwitterFacebookLike this:LikeBe the first to like this [...]

  3. [...] leocaseiro.com.br Categories: PHP, Programação Clique aqui para cancelar a resposta. [...]

  4. Alexandre disse:

    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!

    • Alexandre disse:

      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
      }
      ?>

      • leocaseiro disse:

        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!

  5. Alexandre disse:

    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!

    • leocaseiro disse:

      Já tentou deixar os parametros vazios?

      ex: number_format($valor,0,"","");

    • Igor disse:

      dúvida na mesma questão! Estou usando wordpress e o sistema não reconhece o BRL.

    • Pedro disse:

      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

      • Alexandre disse:

        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.

        • leocaseiro disse:

          Nesse caso, não é mais fácil você dividir por 100?

          $number = 125000048;
          $moeda = number_format($number/100,2,",","."); //1.250.000,48

          • Alexandre disse:

            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!

          • leocaseiro disse:

            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!

    • Leandro disse:

      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.

  6. ryane disse:

    da de botar o numero decimal em imgles

Comentar

CommentLuv badge