Problemas com virgula e com zero

9 respostas
sergio8

Olá pessoal, estou com um problema, fiz um formulário para o usuário digitar um valor e depois mandar esse valor com o hibernate para o banco de dados.
Mas tem um problema, só funciona se digitar por ex: 25.00 e não 25,00. Como faço para transformar essa vírgula em . antes de enviar para o banco de dados?

E também outra dúvida, quando envio por exemplo 25.00, ele insere 25.0 no banco de dados, como faço para mudar isso?

Obrigado.

9 Respostas

wagnerfrancisco

Você precisa fazer parsing da string para um tipo numérico. Algo assim:

NumberFormat format = DecimalFormat.getInstance();
Number number = format.parse("1,23");
System.out.println(number);

Aí você persiste number. Caso seu formato de número seja diferente, você pode especificar no NumberFormat. Mas pelo que você passou, é isto mesmo.

d34d_d3v1l

eu faço um replace:

String num = "1,5";

double number = Double.parseDouble(num.replace(",","."));
davidbuzatto

O código do wagnerfrancisco vai funcionar pq o método format é sensível ao locale da máquina em que a aplicação está rodando.
Se rodar em uma máquina com o locale americano por exemplo, vai dar problema (acho que uma NumberFormatException).
Para ter certeza que vai funcionar, force o locale do NumberFormatter.

Outra coisa. O banco vai gravar como 25.0 pois essa é a representação interna de um número em decimal e você, definitivamente, não precisa se preocupar com isso.

sergio8

Eu não entendo o lance de transformar a String em um double, porque se eu não me engano o Springs já passa o campo “valor” como um double para o controlador e depois para o dao.

Tenho esse formulário:

`	<form action="cadastrarConta" method="post">

		<table align="center">
			<tr><td>Descrição da conta:</td><td><input type="text" name="descricao" /></td></tr>
			<tr><td>Valor:</td><td><input type="text" name="valor" /></td></tr>
			<tr><td>Data:</td><td><input type="text" name="data" /></td></tr>
			<tr><td><input type="submit" value="Cadastrar" /></td></tr>
		</table>

	</form>

No controlador a ação cadastrarConta, está assim:

@RequestMapping("cadastrarConta")
	public String cadastrarConta(Conta conta) {
		
		session = new HibernateUtil().getSession();
		
		session.beginTransaction();
		
		ContaDAO dao = new ContaDAO(session);
		
		dao.cadastrar(conta);
		
		session.getTransaction().commit();
		
		session.close();
		
		return "painel/cadastrar-conta";

E no dao, assim:

public void cadastrar(Conta conta) {
		
		this.session.save(conta);
		
	}

Agora sobre o dois zeros do 25,00, é porque quero listar como um valor, só que quando eu listo no site, aparece somente um zero.

Obrigado a todos pelas respostas.

wagnerfrancisco

davidbuzatto:
O código do wagnerfrancisco vai funcionar pq o método format é sensível ao locale da máquina em que a aplicação está rodando.
Se rodar em uma máquina com o locale americano por exemplo, vai dar problema (acho que uma NumberFormatException).
Para ter certeza que vai funcionar, force o locale do NumberFormatter.

Outra coisa. O banco vai gravar como 25.0 pois essa é a representação interna de um número em decimal e você, definitivamente, não precisa se preocupar com isso.

Realmente, a solução que postei depende do Locale da máquina. Fosse uma aplicação desktop internacionalizável até justificaria usar o locale da máquina. :twisted:

wagnerfrancisco

Tu não falou que tava usando Spring. Creio que o conversor do Spring não considera o Locale pra converter. Você pode registrar um converter customizado, algo assim:

package org.springframework.samples.mvc.convert;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;

import org.springframework.core.convert.converter.Converter;

public class SpringToDouble implements Converter<String, Double> {
	@Override
	public Double convert(String str) {
		NumberFormat number = new DecimalFormat("#,##0.00");
		try {
			return (Double) number.parse(str);
		} catch (ParseException e) {
			return null;
		}
	}

}

E adicione ele no conversionService default:

<beans:bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
   <beans:property name="converters">
      <beans:list>
         <beans:bean class="org.springframework.samples.mvc.convert.SpringToDouble" />
      </beans:list>
   </beans:property>
</beans:bean>

Você pode formatar o valor registrando um formatador customizado. O procedimento é semelhante a este que lhe passei.

davidbuzatto

Ai, por uma infelicidade do destino, a aplicação dele vai parar em uma máquina configurada com outro locale. Boom, NumberFormatException.

E

Ai, por uma infelicidade do destino, a aplicação dele vai parar em uma máquina configurada com outro locale. Boom, NumberFormatException.

É muito comum aplicações em Spring serem deployadas em máquinas Linux que estão configuradas com a linguagem = inglês americano, até por uma questão de costume (muita gente não se sente à vontade com mensagens do sistema operacional ou do banco de dados em português, porque é mais difícil achar essas mensagens na Internet ou então em algum manual impresso, que normalmente vem em inglês mesmo.)

wagnerfrancisco

Ai, por uma infelicidade do destino, a aplicação dele vai parar em uma máquina configurada com outro locale. Boom, NumberFormatException.

Tem razão, melhor não usar o locale da máquina mesmo…

Criado 25 de agosto de 2012
Ultima resposta 27 de ago. de 2012
Respostas 9
Participantes 5