Input Number não considera os decimais
10/12/2015 20:38
0
Tenho esse HTML:

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.

Alguém já passou por isso?
Tags: Grails input number Double decimal


0
Victor,

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


0
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.


0
Victor,
já passei por isto. Verificou as configurações de internacionalização do seu browser?


0
Victor,

você pode sobrescrever a formatação do grails forçando o locale que desejar.

Segue exemplo
http://stackoverflow.com/questions/32683496/grails-locale-independent-decimal-databinding


0
Lembra como resolveu Kiko? To usando o Chrome com idioma Português (Brasil)

Não entendi bem a solução do stackoverflow Leandro.


0
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).
29/12/2015 11:40


0
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.
29/12/2015 11:52


0
Bom, descobri que se eu forçar o locale como US o problema não acontece.
Basta alterar o  conf/spring/resources.groovy
beans = {
localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
defaultLocale = new Locale("en","US")
java.util.Locale.setDefault(defaultLocale)
}
}
?
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.


1
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:


import grails.databinding.converters.ValueConverter
class NumeroConverter implements ValueConverter {
  boolean canConvert(value) {
        value instanceof String
    }
    def convert(value) {
        if (value == null) {
          return null
        }
        if (value != null && value.trim() == '') {
          return null
        }
        if (value?.contains(',')) {
          return new BigDecimal(value.replaceAll(",", "."))
        } else {
          return new BigDecimal(value)
        }
    }
    Class<?> getTargetType() {
        BigDecimal
    }
}


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):


// Place your Spring DSL code here
beans = {
  localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
    defaultLocale = new Locale("pt","BR")
    java.util.Locale.setDefault(defaultLocale)
 }
  // olha o value converter aí em baixo :)
 valorConverter sistema.NumeroConverter
}



0
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!
18/01/2016 13:32


0
Testei a solução do Kiko, mas tive que modificar o resources.groovy para funcionar. 

beans = {
localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
defaultLocale = new Locale("pt","BR")
java.util.Locale.setDefault(defaultLocale)
}
"defaultGrailsjava.lang.DoubleConverter"(DoubleConverter)
}

Onde DoubleConverter ficou:

import grails.databinding.converters.ValueConverter;

public class DoubleConverter implements ValueConverter {

@Override
public boolean canConvert(Object value) {
value instanceof String
}

@Override
public Object convert(Object value) {
if (value == null) {
return null
}
if (value != null && value.trim() == '') {
return null
}
if (value?.contains(',')) {
return new Double(value.replaceAll(",", "."))
} else {
return new Double(value)
}
}

@Override
public Class<?> getTargetType() {
return Double;
}
}?

Obrigado galera!



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto