segunda-feira, novembro 29, 2010

E_DINHEIRO Validador para web2py

Criei um validator para web2py, mas ao nomear, fugi do padrão IS_SOMETHING, já que o formato é específico do Brasil.

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

Um comentário:

L-Tadeu disse...

Alexandre, me chamo lucas e estou começando a programar em Python a traves do WEB2PY. E dando uma busca achei esse validador. Teria como você me falar como que eu faço pra colocar ele pra funcionar. Pois fiquei procurando como colocar ele, e nada. Fico grato desde já. Meu e-mail é lcastadeu@gmail.com