Campo double aceitar virgula

24 views
Skip to first unread message

Leandro - ProfessionalIT

unread,
Sep 29, 2009, 7:40:44 PM9/29/09
to web2py-users-brazil
Pessoal,

Tenho uma tabela com o campo:
Field('preco','double', default='0.00'),

Ao gerar um crud.update ou crud.create desta tabela ela não esta
permitindo digitar um valor com virgula, por exemplo:

22,50 (Dá erro !)
22.50 aceita !

Como posso resolver isto ?

Renato Caliari

unread,
Sep 29, 2009, 8:00:01 PM9/29/09
to web2py-us...@googlegroups.com

No grupo web2py-users em inglês teve uma questão parecida:

And as a decimal sign, we use ',' not '.'. Again, how to change it in
  the forms?

O Massimo deu esta resposta:

Evil! You must edit the web2py_ajax and comment ajax validation of  
float. Then create a validator like

def LOCALIZE_FLOAT:
     def __init__(self,separator): self.s=str(separator)
     def __call__(self,value): return (value.replace(self.s,'.'),None)
     def formatter(self,value): return str(value).replace('.',self.s)

db.table.field.requires=[LOCALIZE_FLOAT(T('.')),IS_FLOAT_IN_RANGE
(0,100)]

then translate the '.' into '.' using the translation interface. If  
you only deal with european floats, just put self.s=','.
______
Renato


2009/9/29 Leandro - ProfessionalIT <lsev...@gmail.com>

ProfessionalIT

unread,
Sep 29, 2009, 8:30:33 PM9/29/09
to web2py-users-brazil
Renato,

A parte do web2py_ajax é fácil, pois é uma expressão regular que tu
altera dai ele aceita a digitação, mas quanto to tentando salvar deste
este erro:

Se coloco isso na minha tabela no db.py:
db.pampa_tabelapreco.preco.requires=[LOCALIZE_FLOAT
(','),IS_FLOAT_IN_RANGE(0,100)]

Da esse erro:
TypeError: 'NoneType' object is not callable

Se coloco isso:
db.pampa_tabelapreco.preco.requires=LOCALIZE_FLOAT(',')

Dá esse erro:
fields[fieldname] = float(fields[fieldname])
ValueError: invalid literal for float(): 1,88

Renato Caliari

unread,
Sep 29, 2009, 9:12:34 PM9/29/09
to web2py-us...@googlegroups.com
Fiz um teste. No meu db.py coloquei:

class separator:

    def __init__(self,separator): self.s=str(separator)
    def __call__(self,value): return (value.replace(self.s,'.'),None)
    def formatter(self,value): return str(value).replace('.',self.s)

db.principal.valor.requires=[separator(T('.')),IS_FLOAT_IN_RANGE(0,100)]

E no pt-br.py eu traduzi o "." por ",".

Os valores do crud salvaram com "," tanto colocando "." ou ",". Não sei se seria isto que está querendo e nem sei se seria a melhor solução, só estou seguindo a dica rápida que vi no outro grupo.

2009/9/29 ProfessionalIT <lsev...@gmail.com>

ProfessionalIT

unread,
Sep 29, 2009, 9:20:00 PM9/29/09
to web2py-users-brazil
Na pasta modules eu criei um arquivo chamado brazil_validators.py e
dentro dele coloquei isso:

from gluon.contrib.validators import *

class LOCALIZE_FLOAT(Validator):
def __init__(self,separator): self.s=','
def __call__(self,value): return (value.replace
(self.s,'.'),None)
def formatter(self,value): return str(value).replace('.',self.s)

agora no db.py
from brazil_validators import *

e no meu campo:
db.pampa_tabelapreco.preco.requires=[LOCALIZE_FLOAT(T
('.')),IS_FLOAT_IN_RANGE(0,100000)]

e ta dando esse erro:
NameError: name 'LOCALIZE_FLOAT' is not defined

Como faço para uma classe dentro de um arquivo .py da pasta modules
ser visivel/acessivel dentro do db.py ?

Para efeitos de teste coloquei o validator dentro de validators.py
e funcionou, mas queria que ele ficasse + desacoplado do framework e
fosse plugável através de uma classe de um módulo do meu projeto, não
sei se to falando besteira, mas isto é o mais correto né ?

ProfessionalIT

unread,
Sep 29, 2009, 9:23:40 PM9/29/09
to web2py-users-brazil
Renato,

A tua solução parece ser a mais correta, mas só achei estranho
funcionar a classe Separator sem ela extender um Validator, Vou fazer
um teste aqui e conforme for vou seguir a sua idéia.

Renato Caliari

unread,
Sep 29, 2009, 9:33:59 PM9/29/09
to web2py-us...@googlegroups.com
O melhor jeito é não acoplar mesmo.
Para poder colocar em um módulo separado tente importar assim onde você está tentando utilizar:

from applications.suaapp.modules.brazil_validators import *

Troque a string "suaapp" logo acima pelo nome da sua aplicação e veja se o LOCALIZE_FLOAT funciona.

2009/9/29 ProfessionalIT <lsev...@gmail.com>

ProfessionalIT

unread,
Sep 29, 2009, 9:43:29 PM9/29/09
to web2py-users-brazil
Eita !, não é que funcionou ?!

Obrigado demais Renato !, agora a menta está aberta para extender
outros pontos da web2py na minha aplicação.

Valeu mesmo pela força !.

Um grande abraço,
Leandro.
Reply all
Reply to author
Forward
0 new messages