VRaptor 4 - Double/Float Converter

132 views
Skip to first unread message

Valdenio Paulino de Melo

unread,
Apr 10, 2014, 3:30:39 PM4/10/14
to caelum-vr...@googlegroups.com
Pessoal,

Encontrei um bug nos converters de double e float. Como eles são localizados, dependendo da região a conversão não funciona. 
Por exemplo, no Brasil, usamos a ',' como separador. Ao tentar converter "200,48" o resultado é 200,48 (correto), porém se o usuário digitar "200.48", a conversão retorna 20048.0 (errado), ou seja, ela ignora os caracteres desconhecidos. Isso acontece por que está sendo utilizado o NumberFormat para a conversão (fonte).

Para uma solução rápida, eu criei uma classe com @Specializes e fiz a correção assim, no método convert (ficou parecido com a implementação do VRaptor 3):

try {
value = value.replace(",", ".");
return Double.valueOf(value);
} catch (NumberFormatException e) {
...
}

Essa não é a melhor forma de corrigir, pois estou ignorando o Locale
Esse problema acontece nas classes DoubleConverter, FloatConverter, PrimitiveDoubleConverter e PrimitiveFloatConverter, todas do do pacote br.com.caelum.vraptor.converter

Otávio Garcia

unread,
Apr 10, 2014, 4:55:10 PM4/10/14
to caelum-vr...@googlegroups.com
Dê uma olhada nos converters, especialmente no método getNumberFormat: https://github.com/caelum/vraptor4/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/converter/DoubleConverter.java#L71

Aqui nós pegamos o formato conforme o locale. O Locale é gerado por um producer: https://github.com/caelum/vraptor4/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/core/JstlLocalization.java#L94

E para pegar o Locale nós buscamos pelo request, sesssion e application. Se não encontrarmos buscamos no web.xml e depois pelo locale da JVM. Ou seja, você precisa informar o Locale, caso contrário é pego o Locale da máquina.

Aqui explica como alterar o Locale: https://github.com/caelum/vraptor4/wiki/05---Conversores#definindo-a-localiza%C3%A7%C3%A3o-locale-da-aplica%C3%A7%C3%A3o

Otávio Garcia

unread,
Apr 10, 2014, 5:00:55 PM4/10/14
to caelum-vr...@googlegroups.com

Valdenio Paulino de Melo

unread,
Apr 10, 2014, 5:43:46 PM4/10/14
to caelum-vr...@googlegroups.com
Eu já tinha visto esses links antes de postar, mas valeu pelas dicas.

Acho que não devo ter explicado direito, a classe que eu fiz foi para prevenir os casos em que o usuário digite um padrão diferente do Locale. (Ex.: se ele digitar '.', quando o Locale for pt-BR). 
Mas, pensando bem, acho que essa verificação não deve ficar no vraptor, pois é um erro de digitação do usuário.

Otávio Garcia

unread,
Apr 10, 2014, 7:13:17 PM4/10/14
to caelum-vr...@googlegroups.com
Valdenio, o problema é que fazer esse replace funciona para caso o usuário digitar 0.00. Mas e se ele digitar 40.000,00? Ou seja, quarenta mil?

Minha opinião e que se o Locale é pt-BR, o usuário tem que digitar no formato pt-BR. Afinal, se você preencher um cheque com o valor errado, ele não entra :).

O que você pode fazer é a sugestão que o Lucas deu lá na issue, de usar uma mascara. Para o jquery tem um plugin bem legal, o meio-mask, que vai te ajudar. Uso ele nos meus projetos aqui. https://github.com/fabiomcosta/jquery-meiomask



--
You received this message because you are subscribed to the Google Groups "caelum-vraptor-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to caelum-vraptor-...@googlegroups.com.
To post to this group, send email to caelum-vr...@googlegroups.com.
Visit this group at http://groups.google.com/group/caelum-vraptor-dev.
For more options, visit https://groups.google.com/d/optout.

Valdenio Paulino de Melo

unread,
Apr 10, 2014, 8:35:35 PM4/10/14
to caelum-vr...@googlegroups.com
Muito obrigado!

Vou usar esse plugin ou até mesmo o pattern do html5
Reply all
Reply to author
Forward
0 new messages