STRUTS 2: Problemas com double e float com locale = pt_BR

2 respostas
Zanutto

Usando-se o locale pt_BR nas requisições do browser, o struts 2 formata valores do tipo Date() certinho de acordo com o locale definido no browser do usuário… Mas no que diz respeito a double e float o separador decimal é sempre um ponto e não uma vírgula como deveria ser no Brasil. Na realidade já mudei o locale do browser para diversos outros idiomas que também usam vírgula como separador decimal e as respostas continuam as mesmas…

Só para ter uma idéia de como estou fazendo os testes, criei uma classe Teste.class:

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class Teste  extends ActionSupport {

	private double f1 = 123.4;

	private Date data = new Date();
	
	public String vamove(){
		
		return "vamove";
	}
	
	public double getF1() {
		return f1;
	}
	public void setF1(double f1) {
		this.f1 = f1;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}
	
}

Defini o result no xml do “vamove” para o arquivo teste.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
<%@ taglib prefix="s" uri="/struts-tags" %>
			
<html>
<head>
    <title>Teste double</title>

</head>
<body>

<s:form action="teste!vamove" method="post">
	<s:property value="data"/>
	<s:property value="f1"/>
	<s:textfield name="f1" value=""></s:textfield>
	<s:submit></s:submit>
</s:form>
</body>
</html>

Aí quando altero a configuração do idioma do browser (locale) para pt-br (tentei no IE e no FF) a resposta é:
16/05/09 123.4

Ou seja, a data está formatada direitinho, mas o número aparece com ponto ao invés do separador de vírgula (123,4).

Eu sei que dá pra definir um arquivo properties para definir um padrão de exibição etc. Mas o problema meu não é para exibição, mas sim em postar um valor fracionário que o usuário por ser brasileiro digitará provavelemente com a vírgula… O struts dá erro de conversão… ele simplesmente não tá fazendo a conversão dos double baseada em locale. Já dei um getLocale() no código que está recebendo e está correto (pt_BR).

Minha versão do struts é 2.0.14 e do xwork é 2.0.7

Pessoal, espero que possam ajudar. Estou há 2 dias já quebrando a cabeça com isso e consegui resolver com soluções muito porcas do tipo configurar variáveis do tipo String pra receber o valor do post e depois fazer a conversão via código… Mas é horrível ter que quebrar toda a estrutura de orientação a objeto pra ficar fazendo esses POG… Não é possível que o Struts 2 não tenha um jeito mais fácil e mais limpo de se resolver este problema.

Abraços!

2 Respostas

R

Oi,

O seguinte link me levou a solução do problema.

http://issues.apache.org/struts/browse/WW-2349

Resumindo o conversor é localizado mas a renderização do valor no formulário não é. O que leva a uma inconsistência.

A solução é localizar a renderização no formulário usando a função getText() conforme o exemplo abaixo:

<s:textfield name=“lat” label=“Latitude” labelposition=“left” value="%{getText(’{0,number,#0.0##}’,{lat})}"/>

Parece que existe tb um problema relacionado a usar um valor primitivo ou um Wrapper.

No meu caso eu usava um wrapper e a linha acima resolveu o problema.

Aloha,

Rafael Sobral

R

Completando a informação acima:

Parece que se a propriedade é um wrapper ele realiza a localização, enquanto que se for um primitivo ele usa ponto como separador.

Criado 15 de maio de 2009
Ultima resposta 2 de dez. de 2009
Respostas 2
Participantes 2