Tratando Double no Statment (trocar vírgula por ponto)

Bom dia galera!

Estou com um problema onde já lí e tentei o indicado por vários tópicos aqui no GUJ e no Google mas não tive sucesso.

Tenho um campo do formulário web que estarei inserindo / atualizando um valor double no BD, porém se o valor digitado no campo for com vírgula da pau, só aceita o valor com ponto

Na minha DAO estou usando spring e statment:

variável na classe Peca.java

private double tempoCicloPeca;

	public double getTempoCicloPeca() {
		return tempoCicloPeca;
	}
	public void setTempoCicloPeca(double tempoCicloPeca) {
		this.tempoCicloPeca = tempoCicloPeca;
	}

Trecho do código da DAO, o problema está lá na stmt 4

PecaDAO.java

	public void atualizaTempoCiclo(Peca peca) {
		
		String sqlInsere = "insert into tempo_ciclo_pecas (planta, rua, peca, tempo_ciclo, data_atualizacao) values(?,?,?,?,Now()) ";
		PreparedStatement stmt;
		try {
			stmt = connection.prepareStatement(sqlInsere);
			stmt.setString(1, peca.getPlanta());
			stmt.setString(2, peca.getRua());
			stmt.setString(3, peca.getNomePeca());
			stmt.setDouble(4, peca.getTempoCicloPeca());
			stmt.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

já tentei converter em string e usar replace, replaceAll, tentei usar aspas simples e duplas e nada…

			stmt.setString(4, Double.toString(peca.getTempoCicloPeca()).replaceAll(",", ".") );				

Onde que estou errando?

Fico no aguardo!

Obrigado!

Mostre o trecho da excessao gerada.

Pode tentar assim tb:

peca.getTempoCicloPeca().toString().replaceAll(",", ".")

Considerando que peca.getTempoCicloPeca() é uma string, você pode tentar:

 Double.valueOf(peca.getTempoCicloPeca().replace(".", "").replace(",", ".")) ; 

O primeiro replace remove os pontos (Ex: 1.000,00 -> 1000,00)
O segundo replace troca a virgula por ponto (Ex: 1000,00 -> 1000.00)

Use o DecimalFormat,

DecimalFormat f = (DecimalFormat) DecimalFormat.getInstance(new Locale("pt", "BR")); Double d = (Double)f.parse("1.234,56"); System.out.println(d.doubleValue());

Você pode passar o locale como parâmetro caso a máquina esteja em en_US

[quote=rof20004]Mostre o trecho da excessao gerada.

Pode tentar assim tb:

peca.getTempoCicloPeca().toString().replaceAll(",", ".") [/quote]

Usando o que você me passou ele da erro logo no código (fica sublinhado de vermelho), a mensagem neste caso é: Cannot invoke toString() on the primitive type double.

No modo que eu fiz o erro da compilação é:
Field error in object ‘peca’ on field ‘tempoCicloPeca’: rejected value [1,25]; codes [typeMismatch.peca.tempoCicloPeca,typeMismatch.tempoCicloPeca,typeMismatch.double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [peca.tempoCicloPeca,tempoCicloPeca]; arguments []; default message [tempoCicloPeca]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘double’ for property ‘tempoCicloPeca’; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value “1,25” from type ‘java.lang.String’ to type ‘double’; nested exception is java.lang.NumberFormatException: For input string: “1,25”]

[quote=ayslanms]Considerando que peca.getTempoCicloPeca() é uma string, você pode tentar:

 Double.valueOf(peca.getTempoCicloPeca().replace(".", "").replace(",", ".")) ; 

O primeiro replace remove os pontos (Ex: 1.000,00 -> 1000,00)
O segundo replace troca a virgula por ponto (Ex: 1000,00 -> 1000.00)[/quote]

O meu peca.getTempoCicloPeca() é um double… foi como eu disse, tentei conveter ele em string mas não funfei…

Como é a definição do campo na tabela que corresponde a TempoCicloPeça? Pode ser que ele esteja incorretamente definido, por isso é que não está aceitando setDouble :frowning:

Valores double, por padrao nao tem virgula.

Voce tem que formatar sua variavel double, antes de receber o valor, com algum modelo de moeda, nao lembro o nome da classe, é CurrencyFormat se nao me engano. ou entao converter o double para string, e depois inserir as virgulas, ou tirar os pontos.

[quote=thiago.correa]Use o DecimalFormat,

DecimalFormat f = (DecimalFormat) DecimalFormat.getInstance(new Locale("pt", "BR")); Double d = (Double)f.parse("1.234,56"); System.out.println(d.doubleValue());

Você pode passar o locale como parâmetro caso a máquina esteja em en_US[/quote]

Agora fiquei confuso, a dúvida se trata de converter uma string para double ou o inverso?!

Bom, de qualquer forma, dá para usar o decimalFormat (ou o currencyformat caso quiser moeda) para transformar um double em uma string formatada de acordo com o padrão local da máquina

DecimalFormat f = (DecimalFormat) DecimalFormat.getInstance(new Locale("pt", "BR")); String a = f.format(1234.56); System.out.println(a);

[quote=thiago.correa][quote=thiago.correa]Use o DecimalFormat,

DecimalFormat f = (DecimalFormat) DecimalFormat.getInstance(new Locale("pt", "BR")); Double d = (Double)f.parse("1.234,56"); System.out.println(d.doubleValue());

Você pode passar o locale como parâmetro caso a máquina esteja em en_US[/quote]

Agora fiquei confuso, a dúvida se trata de converter uma string para double ou o inverso?!

Bom, de qualquer forma, dá para usar o decimalFormat (ou o currencyformat caso quiser moeda) para transformar um double em uma string formatada de acordo com o padrão local da máquina

DecimalFormat f = (DecimalFormat) DecimalFormat.getInstance(new Locale("pt", "BR")); String a = f.format(1234.56); System.out.println(a);[/quote]

Vamos lá:

Na minha classe variável tempoCicloPeca é um double assim como a coluna do BD, não posso mudar pra String pois ela já está sendo usado em alguns cálculos.

No formulário web se coloco o número separado por . ele entra normalmente… se eu colocar separado por vígula ele da o erro que mencionei.

Eu pensei em converter o número para string para trocar a vírgula por ponto e depois transformar novamente em double pra inser ou atualizar o bd…

Vou testar o decimal Format…

Qual a mensagem de erro?

No primeiro post você disse que dava erro ao usar setDouble, mas depois disse que era ao preencher o valor no formulário.

Coloque aqui o stacktrace completo do erro.

[quote=AbelBueno]Qual a mensagem de erro?

No primeiro post você disse que dava erro ao usar setDouble, mas depois disse que era ao preencher o valor no formulário.

Coloque aqui o stacktrace completo do erro.[/quote]

Exacto! Também fiquei com a mesma sensação que o problema nada tem a ver com o código postado inicialmente.

[quote=Ailton_Occhi][quote=rof20004]Mostre o trecho da excessao gerada.

Pode tentar assim tb:

peca.getTempoCicloPeca().toString().replaceAll(",", ".") [/quote]

Usando o que você me passou ele da erro logo no código (fica sublinhado de vermelho), a mensagem neste caso é: Cannot invoke toString() on the primitive type double.

No modo que eu fiz o erro da compilação é:
Field error in object ‘peca’ on field ‘tempoCicloPeca’: rejected value [1,25]; codes [typeMismatch.peca.tempoCicloPeca,typeMismatch.tempoCicloPeca,typeMismatch.double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [peca.tempoCicloPeca,tempoCicloPeca]; arguments []; default message [tempoCicloPeca]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘double’ for property ‘tempoCicloPeca’; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value “1,25” from type ‘java.lang.String’ to type ‘double’; nested exception is java.lang.NumberFormatException: For input string: “1,25”][/quote]

O erro está na hora que você passa o valor do formulário para a variável tempoCicloPeca, você precisa converter o valor que está no formulário para o double e depois passar ele para a variável.

Galera tive duas soluções uma prática e a outra lógica.

Solução prática, usei Jquery pra formatar o campo substituindo a vígula por ponto.

Solução Lógica, como eu falei, estou usando o Spring pra pegar os valores do formulário e setar direto na variável, sendo assim não estou usando HttpServeletRequest e Response, o valor ja vem com o formato da variável e não como texto.

Um professor me indicou procurar pelos anotações e deu certo, usei um anotation so Spring na variável que já formata ela:

@NumberFormat(style = Style.NUMBER, pattern = "#,###.###")
private double tempoCicloPeca;

Porém as coisas tiveram um pequena bagunça, quando digito o valor com ponto no formulário, ele atualiza ou insere o valor no BD mas ignora o ponto, exemplo: Se digito 1,2248 no BD fica 12248 sem decimal.

Resultado, como aqui no Brasil utilizamos a virgula pra formatar casa decimal, usei o anotation e usei o Jquery pra formatar o ponto, quando o usuario colocar ponto ele troca sozinho para virgula:

	//Somente Números - habilita verificação dos caracteres digitado
	$(".numero").keyup(function(){
		s = $(this).val();
		if( !(s.toString().search(/^-?([0-9]|[.]|[,]|[-])+$/) == 0) ){
		$(this).val(''); 
		}
		$(this).val( $(this).val().replace(".",",") );
	});

A solução que econtrei foi essa, caso souberem algo melhor por favo me avisem.

Obrigado a todos!!!

Este tema já foi várias vezes discutido aqui no fórum.

Você tem que usar o replaceAll() msm, só que o parametro enviado tem que ser uma expressão regular.

Tenta assim:

stmt.setString(4, Double.toString(peca.getTempoCicloPeca()).replaceAll("\\,", ".") );

Lembrando sempre que String são imutáveis. Se você fizer isso:

String numero = "123,23"; numero.replaceAll("\\,", "."); System.out.println(numero);
A saída sera 123,23 pq a String como dito é imutável. Agora se vc fizer assim:

String numero = "123,23"; String numeroPonto = numero.replaceAll("\\,", "."); System.out.println(numeroPonto);
A saída será 123.23