Ari
Se você define um:
Field('SALARIO', 'decimal(5,2)')
Esta coluna no SGDB aceita de -99999.99 até 99999.99
Na definição:
tb_teste.SALARIO.requires = [IS_NOT_EMPTY(), IS_MONEY(0,99999.99,dot=',',symbol='R$')]
o validator IS_MONEY retira o symbol 'R$', e chama o validator IS_DECIMAL que herda de IS_DECIMAL_IN_RANGE, passando:
minimum=0
maximum=99999.99
dot=',' #<<<< Aqui você está dizendo que o DECIMAL POINT IS COMMA (ponto decimal é virgula)
que por sua vez retira a edição e valida o range se positivo e < que 100000
>>> IS_MONEY(0,99999.99, dot=',', symbol='R$')('R$ 12.345,67')
(Decimal('12345.67'), None)
>>> IS_MONEY(0,99999.99, dot=',', symbol='R$')('R$ 12345,67')
(Decimal('12345.67'), None)
>>> IS_MONEY(0,99999.99, dot=',', symbol='R$')('12345,67')
(Decimal('12345.67'), None)
>>> IS_MONEY(0,99999.99, dot=',', symbol='R$')('1234567')
('1234567', 'enter a number between 0 and 100000')
Na definição:
tb_teste.SALARIO.represent = lambda value, row: MASK_MONEY(dot=',',symbol='R$')(value, 2)
o represents MASK_MONEY (que chama o represents MASK_DECIMAL e acrescenta o 'symbol')
Está recebendo
dot=',' #<<<< Aqui você está dizendo também que o DECIMAL POINT IS COMMA (ponto decimal é virgula)
symbol='R$'
(value, 2) o valor da coluna e a quantidade de decimais
>>> MASK_MONEY(dot=',', symbol='R$')('12345.67', 2)
'R$ 12.345,67'
Para testar execute o web2py em terminal interativo
no prompt digite:
$ python web2py.py -S myapp -M
[]s
Flávio