Assim, usei E_DINHEIRO, apenas para facilitar a formatação. O tipo de campo para armazenamento deve ser decimal, mas é necessário excluir a linha que possui a palavra 'double' em web2py_ajax.html, pois ele impede a digitação de vírgulas:
-------------------------------------------------------------------------------------------------------------------------------
jQuery('input.double,input.decimal').live('keyup', function(){this.value=this.value.reverse().replace(/[^0-9\-\.]|[\-](?=.)|[\.](?=[0-9]*[\.])/g,'').reverse();});
------------------------------------------------------------------------------------------------------------------------------
Parece que pode ser possível adaptar a linha acima para aceitar vírgulas, quem souber como fazer deixe um comentário.
class E_DINHEIRO(object): def __init__(self, format=True, error_message='Digite o valor!'): self.format = format self.error_message = error_message def __call__(self, value): d=str(value) d = d.replace('.','') d = d.replace(',','.') #return (value, valor[-3:-2]) try: return (d, None) except: return (d,str(d)+'o valor digitado não é um número válido') def formatter(self, value): value = str(value) c = [] for d in value: if d.isdigit(): c.append(d) value = str(''.join(c)) l = len(value) #10 = 1000000000 = 10.000.000,00 i = l - 2 #8 p = i / 3 #2 r = (l % 3) #2 #p = 3 pf = i-1 if l == 1: formatado = '0,0'+value elif l == 2: formatado = '0,'+value elif l > 2: d = ','+value[-2:] s = '' n = r+1 s += value[0:r+1] if i > 3: while n < i: pt = n + 3 s += '.'+ value[n:pt] n = pt formatado = s+d else: formatado = value return formatado
Use o validator como um validator comum do web2py:
Field('preco','decimal(20,2)',requires=E_DINHEIRO(),represent=lambda field:currency(field), label='Preço'),
Para permitir apresentar o formato quando não está usando formulário, use:
def currency(value):
import locale
locale.setlocale( locale.LC_ALL, 'pt_BR.UTF-8' )
value = locale.currency(value,grouping=True)
return value
em uma view:
{{=currency(row.preco)}}
--
Atenciosamente
--
=========================
Alexandre Andrade
Hipercenter.com