Input Number não considera os decimais
R$ <input type="number" step="0.01" min="0" name="valorMaximo" required />
E na classe de Dominio o atrubuto valorMaximo do tipo Double.
Quando envio a requisição para o controller, o valor inserido na tela como 25,25 (com vírgula ou ponto) chega no atributo com o valor: Double 2525.0
Ou seja, ele está desconsiderando a virgula ou o ponto por algum motivo.
Tags: Grails input number Double decimal
dá uma olhada na documentação na parte que fala em scale para números com casas decimais.
https://grails.github.io/grails-doc/3.0.x/guide/single.html#gormConstraints
Olha eu já inseri em "constraints": valorMaximo scale: 2
Mas o comportamento é o mesmo. Lembrando que ele já chega no Controller com o valor errado.
já passei por isto. Verificou as configurações de internacionalização do seu browser?
você pode sobrescrever a formatação do grails forçando o locale que desejar.
http://stackoverflow.com/questions/32683496/grails-locale-independent-decimal-databinding
Lembra como resolveu Kiko? To usando o Chrome com idioma Português (Brasil)
Não entendi bem a solução do stackoverflow Leandro.
Estou com o mesmo problema. Percebi que quando o valor é exibido no input ele vem com "." na separação da parte fracionária, ex: "2.25". Se eu gravo dessa forma, o valor armazenado é 225. Se eu manualmente troco o "." pela ",". Grava certo. Ou seja, a conversão de String para Double está correto, o inverso é que falha (Double para String).
Se olho no params está assim "quantidade:10.0000" no objeto aparece assim "obj.quantidade:100000.0000". Minha solução "tosca" foi fazer
formula.quantidade = params.double("quantidade");
antes de executar o save.
Bom, descobri que se eu forçar o locale como US o problema não acontece.
Basta alterar o conf/spring/resources.groovy
defaultLocale = new Locale("en","US")
Porém, meu sistema é em português mesmo e me traria outros problemas. Então a solução que adotei foi trocar o type="number" por type="text" e criar o formato numérico no input com javascript.
Há uma solução mais interessante.
Seguinte: quando usamos qualquer framework que não foi desenvolvido no Brasil, você deve levar em consideração o fato de que estamos lidando com uma ferramenta desenvolvida fora do Brasil. E lá fora, números decimais usam o caractere de vírgula ao invés de ponto.
Então você pode resolver o problema implementando um ValueConverter. Busque por "Custom Data Converters" na documentação oficial do Grails. Como exemplo, vou te mostrar o que implementei para um projeto no qual estou representando valores de ponto flutuante com a classe BigDecimal. Seu trabalho consiste em primeiro escrever uma classe que implemente a interface ValueConverter, tal como a exposta no exemplo abaixo:
class NumeroConverter implements ValueConverter {
if (value != null && value.trim() == '') {
if (value?.contains(',')) {
return new BigDecimal(value.replaceAll(",", "."))
Depois, basta você registrar esta classe como um bean no arquivo resources.groovy do Spring, tal como no exemplo abaixo (que também define como padrão o idioma em português da aplicação):
defaultLocale = new Locale("pt","BR")
// olha o value converter aí em baixo :)
valorConverter sistema.NumeroConverter
Eu já tinha tentado essa alternativa. Mas não funcionou. Acabei resolvendo da forma que citei acima. Vou tentar fazer um novo projeto, talvez tenha faltado algum detalhe. Obrigado!