Formatando decimal para moeda brasileira

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'
You can leave a response, or trackback from your own site.

3 Responses to “Formatando decimal para moeda brasileira”

  1. João Marcus Christ disse:

    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′

  2. admin disse:

    @João Marcus
    Realmente não conhecia esse módulo. Parece que não pesquisei direito no google.
    Obrigado pela dica!

  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!

Leave a Reply

Powered by WordPress | Shop the Best Verizon Wireless Deals. | Thanks to Best CD Rates, Credit Cards and Credit card