Formatação de números reais

1,034 views
Skip to first unread message

Celso Tonelli

unread,
Aug 3, 2009, 3:48:26 PM8/3/09
to django...@googlegroups.com
Bom tarde galera,

Em alguns models e forms estou trabalhando com números reais. Dei uma
pesquisada mas não encontrei nada alem do humanize
(http://docs.djangoproject.com/en/dev/ref/contrib/humanize/) sobre
como formatar estes números.

Eu gostaria de trabalhar com números no formato brasileiro, que seria
algo assim: 1.000,50 para indicar mil reais e cinquenta centavos.

Devo criar filtros para mostrar os números neste formato ou tem algo pronto?
Como faria para um field de um form exibir seu conteúdo neste formato?

Vlw,
Celso Tonelli

Gustavo Henrique

unread,
Aug 3, 2009, 9:49:33 PM8/3/09
to django...@googlegroups.com
o python a partir da versao 2.5 tem um metodo chamado
locale.currency() que permite formatar numeros decimais.
o django possui uma templatetag [1] que também pode ajudar nisso.
No meu site fiz uma função [2] que talvez ajude.

[1] http://docs.djangoproject.com/en/dev/ref/templates/builtins/#floatformat
[2] http://www.gustavohenrique.net/brogui/2009/04/formatando-decimal-para-moeda-brasileira/


--
Gustavo Henrique
Site: http://www.gustavohenrique.net
Blog: http://blog.gustavohenrique.net

Mário Neto

unread,
Aug 3, 2009, 11:20:41 PM8/3/09
to django...@googlegroups.com
Ótima dica Gustavo! =)

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'pt_BR.UTF-8'
>>> locale.currency(123456)
'R$ 123456,00'
>>> locale.currency(1234567, grouping=True)
'R$ 1.234.567,00'

2009/8/3 Gustavo Henrique <gusta...@gmail.com>



--
Att. Mário A. Chaves Neto
Analista de Sistemas / U.I. Engineer
Cagece - Companhia de Água e Esgoto do Ceará

Celso Tonelli

unread,
Aug 4, 2009, 7:53:13 AM8/4/09
to django...@googlegroups.com
No host onde está hospedado o meu projeto é utilizado a versão 2.4 do
python então acredito que não terei como utilizar o locale.

E o problema não seria apenas com moeda, também queria poder utilizar
para porcentagem, ou qualquer outro número decimal.

Por exemplo, eu tenho um model onde é inserida uma porcentagem de
desconto, quando eu crio um model form esse campo é preenchido com o
ponto(.) separando a parte inteira da decimal, por exemplo 5.25 para
indicar 5,25%, eu queria que a vírgula(,) fosse utilizada ao invés do
ponto para separar a parte decimal.

Alguma ideia?

Vlw,
Celso Tonelli



2009/8/4 Mário Neto <macnd...@gmail.com>:

Matheus Henrique dos Santos

unread,
Aug 4, 2009, 9:03:16 AM8/4/09
to django...@googlegroups.com
Normalmente no meu model eu utilizo deste modo:

from locale import setlocale, currency as moeda, LC_ALL

class Produto(models.Model):

[ ... campos ... ]

def preco_real(self):
setlocale(LC_ALL,'pt_BR.UTF-8')
return moeda(self.preco, grouping=True)
preco_real.short_description = 'Preço'


ai no template eu chamo ele como se fosse um campo normal do model




On Tue, 4 Aug 2009 08:53:13 -0300, Celso Tonelli <celsot...@gmail.com>
wrote:
--
Atenciosamente,

Matheus Henrique dos Santos
Reatorweb Desenvolvimento e Hospedagem
Rua Antonio Lago, 719 - Jd. Pres. Dutra II
Ribeirão Preto - SP - 14060730 - Brasil
http://www.reatorweb.com
T +55 16 9118.9198

Igor Sobreira

unread,
Aug 4, 2009, 9:03:11 AM8/4/09
to django...@googlegroups.com


2009/8/4 Celso Tonelli <celsot...@gmail.com>


No host onde está hospedado o meu projeto é utilizado a versão 2.4 do
python então acredito que não terei como utilizar o locale.

E o problema não seria apenas com moeda, também queria poder utilizar
para porcentagem, ou qualquer outro número decimal.

Por exemplo, eu tenho um model onde é inserida uma porcentagem de
desconto, quando eu crio um model form esse campo é preenchido com o
ponto(.) separando a parte inteira da decimal, por exemplo 5.25 para
indicar 5,25%, eu queria que a vírgula(,) fosse utilizada ao invés do
ponto para separar a parte decimal.

Alguma ideia?

Nesses casos é melhor criar um campo pra o model e sobrescrever o método formfield() [1].
Aí nele você retorna um campo de formulário que você também criou, e no clean() desse campo você faz a validação esperando o valor formatado como você quer. E pra exibir o valor pra edição, você criaria um widget que esse campo de formulário usaria por padrão.

Parece muita coisa mas não é, são 3 classes bem pequenas. Dá uma olhada nos fontes do django que você vai entender como funciona.

Sobre formatar pra reais, não conhecia o locale.currency(), muito bom! O Vinicius Mendes, que participa aqui da lista, postou um field pra usar valores monetários em real:



--
Igor Sobreira
www.igorsobreira.com
www.smartnutstechnology.com

Igor Sobreira

unread,
Aug 4, 2009, 9:07:23 AM8/4/09
to django...@googlegroups.com


2009/8/4 Matheus Henrique dos Santos <mat...@reatorweb.com>


Normalmente no meu model eu utilizo deste modo:

from locale import setlocale, currency as moeda, LC_ALL

class Produto(models.Model):

   [ ... campos ... ]

   def preco_real(self):
       setlocale(LC_ALL,'pt_BR.UTF-8')
       return moeda(self.preco, grouping=True)
   preco_real.short_description = 'Preço'


ai no template eu chamo ele como se fosse um campo normal do model


Eu só mudaria uma coisa: deixaria preco_real como uma property, e não um método. Pra o template tanto faz porque não se usa () pra chamar funções lá, mas faz mais sentido "preco_real" ser uma propriedade do produto, e não uma ação :-)

Celso Tonelli

unread,
Aug 4, 2009, 9:45:54 AM8/4/09
to django...@googlegroups.com
Igor,

vou fazer conforme você sugeriu, vou dar uma alterada no field do Vinicius Mendes (http://djangotidbits.com/14/). 

E pra mostrar os valores no template eu vou criar um filter.

Vlw,
Celso Tonelli


2009/8/4 Igor Sobreira <ig...@igorsobreira.com>
Reply all
Reply to author
Forward
0 new messages