GustavoHenrique.net

  • About
  • Contact
  • RSS Feed
  • Twitter

 

30
Apr

Formatando decimal para moeda brasileira

By gustavohenrique|Django|3 Comments

O código abaixo mostra uma maneira simples de formatar números decimais (float) para a moeda brasileira: Real. É um exemplo simples que o método retorna uma string no formato R$ X.XXX,XX.

def moeda_brasileira(numero):
    """
    Retorna uma string no formato de moeda brasileira
    """
 
    try:
        contador = 0
        preco_str = ''
        num = numero.__str__()
        if '.' in num:
            preco, centavos = num.split('.')
        else:
            preco = num
            centavos = '00'
 
        tamanho = len(preco)
        while tamanho > 0:
            preco_str = preco_str + preco[tamanho-1]
            contador += 1
            if contador == 3 and tamanho > 1:
                    preco_str = preco_str + '.'
                    contador = 0
            tamanho -= 1
 
        tamanho = len(preco_str)
        str_preco = ''
        while tamanho > 0:
            str_preco = str_preco + preco_str[tamanho-1]
            tamanho -= 1
 
        return "R$ %s,%s" % (str_preco, centavos)
    except:
        return 'Erro. Nao foi possivel formatar.'
 
 
class Produto(models.Model):
    modelo = CharField(max_length=100)
    preco = DecimalField(max_digits=10,decimal_places=2)
 
    def __unicode__(self):
        return self.modelo
 
    def getPrecoFormatado(self):
        p = str(self.preco)
        if p != 'None':
            preco = moeda_brasileira(p)
            return preco
        else:
            return False
    getPrecoFormatado.short_description = 'Preço'

Exemplo de uso:

>>>produto = Produto.objects.get(id=1)
>>>produto.getPrecoFormatado()
'R$ 1.290,00'
Bookmark It

Add to Del.icio.us Add to Diigo Add to Facebook Add to Google Bookmarks Add to LinkedIn Add to Mister Wong Add to Twitter Add to Yahoo My Web
Tagged as: formatar moeda, moeda brasileira, real
Add your comment →

3 Comments

  1. Não sei se você conhece, mas existe o módulo locale, que já cuida disso:
    >>> locale.setlocale(locale.LC_ALL,”pt_BR.UTF-8″)
    ‘pt_BR.UTF-8′
    >>> locale.currency(123455667.22)
    ‘R$ 123455667,22′
    >>> locale.currency(123455667.22, grouping=True)
    ‘R$ 123.455.667,22′

    By: João Marcus Christ Reply →
    May 8, 2009 at 6:39 pm
  2. @João Marcus
    Realmente não conhecia esse módulo. Parece que não pesquisei direito no google.
    Obrigado pela dica!

    By: admin Reply →
    May 9, 2009 at 12:12 pm
  3. Bom dia!

    Só uma correção do seu código!
    Se o valor for negativo, ele mostra: R$ -.300,00

    CORREÇÃO:
    if contador == 3 and tamanho > 1:
    if int(preco) > 0:
    preco_str = preco_str + ‘.’
    contador = 0

    Falo!

    By: tiago s. moraes Reply →
    July 28, 2010 at 10:50 am

Leave your comment below! Cancel Reply

View More Posts:
  • ←
  • →

Tags

admin Django extjs firewall grails jquery KingHost liberações Linux manual model modelform mod_wsgi moeda brasileira mudanças mysql nível de serviço oo PagSeguro pdf php PIL pisa problemas proxy python qa qos real relacionamento roteamento service desk shell script sites tdd tipsforlinux traducao ubicomp ubuntu urllib virtualhost Webservices wikipedia xsol __init__

Recent Posts

  • Configurando um servidor LDAP no CentOS 6.2
  • Introdução ao padrão MVC no Ext JS 4
  • Virtualização com KVM
  • Autenticação Facebook no Grails
  • Grails com Sqlite3 no Ubuntu 11.04
  • Deploy no tomcat usando django-jython
  • Deploy múltiplas versões do Django no Nginx com VirtualEnv
  • Comandos básicos do Git
  • Introdução ao Apache Wicket
  • Feliz 2011

Archives

Categories

My tweets

  • @tregismoreira Genesis 7200 com android 4 3 days ago
  • @marcomaciel blz! 1 week ago
  • @marcomaciel hack com qualquer linguagem em qualquer plataforma pra mim ta valendo! #soudev 1 week ago
  • Fui instalar o android 2.3 da lg e agora meu celular não liga. #ffuuu 1 week ago
  • Tentando gerar uma NFe e não consigo =/ #stacktrace Impressionante como todos os sites e apps do governo são ruins. 2 weeks ago
  • More updates...

Powered by the inLine Minimal WordPress Theme