Gravando no banco com formato errado valor

29 respostas
F

Meus amigos,

Executei essa sql no MySql:
insert into pedidos_efetuados (
id_produto, id_categoria, data,
preco, qtd, total, nr_mesa, id_usuario)
values (‘1’,‘1’,‘13/09/12’,‘2,50’,‘3’,‘7.5’,‘7’,‘1’)

Onde está 2,50 esta gravando 2.00

O que fazer pra arrumar? Está como float. No Android mostra o valor num TextView como 2.50

To pegando o valor aqui:

String valor1 = Preco.getText().toString();

E passo como parametro aqui:

parametrosPost.add(new BasicNameValuePair("preco",valor1.toString()));

29 Respostas

E

Qual é o tipo do campo que está no banco? Coloque também um System.out.println para saber se o valor1.toString() está vindo de forma correta.

R

Talvez o banco esteja esperando 2.50, e não 2,50

F

Campo Float 10,2

E

E a minha outra pergunta? Tentou que recomendei?
Evite usar float. Use double.

R

você está gravando um valor 7.5 e o valor com erro é 2,5 talvez o problema seja a vírgula

F

Sim, com ponto funcionou.

Como faço para formatar com ponto?

será que é aqui?

public static final DecimalFormat DINHEIRO_REAL = new DecimalFormat("###,##0.00");
R

sim

public static final DecimalFormat DINHEIRO_REAL = new DecimalFormat( "###,##0.00", new DecimalFormatSymbols(new Locale("en", "US")));

F

Tiro essa linha:

private static final Locale BRAZIL = new Locale(“pt”,“BR”);

R

Se utilizar o Locale “pt-BR” ele vai seguir o nosso padrão de formatação, que utiliza a vírgula para separar os decimais.

como você quer utilizar um ponto, pode usar o Locale americano “en-US”

F

Como ja tem naquela linha então posso tirar, né?

Só que aconteceu algo estranho.

Fui gravar no banco o total gravou 750.00

3 * 2.50 é 7.50

qtde = Integer.valueOf(Quantidade.getText().toString());
 Log.i("Quant","Quantidade: " + qtde);
				 
 valor = Preco.getText().toString();
 Log.i("Preço","Preço: " + valor);


 DecimalFormat dateFormat = new DecimalFormat("#,##0.00");  
 double doubleValue = 0;
	try {
	doubleValue = dateFormat.parse(valor.trim()).doubleValue();
	} catch (ParseException e) {
	// TODO Auto-generated catch block
		e.printStackTrace();
	}  
	 total = qtde * doubleValue;  
	 String Tot;
	 
	 Tot = String.valueOf(total);
R

Então o 7.5 que estava errado, tem que usar vírgula pra gravar os decimais.

Agora o por que dele gravar o valor errado, eu não sei.

F

Olha isso no logCat:

09-13 15:26:26.439: I/Quant(396): Quantidade: 3
09-13 15:26:26.439: I/Preço(396): Preço: 2.50
09-13 15:26:26.449: I/Total(396): Total: 750.0

O valor ta gravando certo. O total que ta fazendo errado.

Será que não tá no decimalFormat?

R

o DecimalFormat não vai alterar o valor, só a formatação na hora de transformar em String

F

Porque o total ta errado? O código não ta certo pra fazer o total?

Quantidade: 3
Preço: 2.50
Total: 750.0

qtde = Integer.valueOf(Quantidade.getText().toString());  
Log.i("Quant","Quantidade: " + qtde);  
               
valor = Preco.getText().toString();  
Log.i("Preço","Preço: " + valor);  
  
  
DecimalFormat dateFormat = new DecimalFormat("#,##0.00");    
double doubleValue = 0;  
try {  
doubleValue = dateFormat.parse(valor.trim()).doubleValue();  
} catch (ParseException e) {  
// TODO Auto-generated catch block  
    e.printStackTrace();  
}    
total = qtde * doubleValue;    
String Tot;  
  
Tot = String.valueOf(total);
R

e doubleValue tem que valor ?

F

Ta assim:

Quantidade: 3
Preço: 2.50
Valor doubleValue: 250.0
Total: 750.0

E

O seu DecimalFormat está errado. Se você passar um valor como “2.50”, ele irá mudar para 250.
Ou você passa “2,50” ou altera para :

F

Vou testar aqui e posto o resultado.

F

Ainda ta errado:

09-13 16:56:04.013: I/Quant(741): Quantidade: 3
09-13 16:56:04.013: I/Preço(741): Preço: 2.50
09-13 16:56:04.026: I/doubleValue(741): Valor doubleValue: 250.0
09-13 16:56:04.033: I/Total(741): Total: 750.0

qtde = Integer.valueOf(Quantidade.getText().toString());
 Log.i("Quant","Quantidade: " + qtde);
				 
 valor = Preco.getText().toString();
 Log.i("Preço","Preço: " + valor);
				 
				 
// DecimalFormat dateFormat = new DecimalFormat("#,##0.00");
   DecimalFormat dateFormat = new DecimalFormat("#,##0,00");
   double doubleValue = 0;
   try {
	doubleValue = dateFormat.parse(valor.trim()).doubleValue();
   } catch (ParseException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
  }  
 total = qtde * doubleValue;
R

faltou o DecimalFormatSymbols com o Locale “en-US”

E

ErickRAR:
O seu DecimalFormat está errado. Se você passar um valor como “2.50”, ele irá mudar para 250.
Ou você passa “2,50” ou altera para :

ESSE DecimalFormat é que está errado. Uma vírgula, em um DecimalFormat, é um separador de milhares. Para especificar que o separador de milhares é um ponto e a vírgula ou ponto decimal é uma vírgula, deve-se usar:

// Formato: 2,50
Locale brazil = new Locale ("pt", "BR");
DecimalFormatSymbols dfs = new DecimalFormatSymbols (brazil);
DecimalFormat dateFormat = new DecimalFormat("#,##0.00", dfs);
// Formato: 2.50
Locale us = Locale.US;
DecimalFormatSymbols dfs = new DecimalFormatSymbols (us);
DecimalFormat dateFormat = new DecimalFormat("#,##0.00", dfs);
R

entanglement:
ErickRAR:
O seu DecimalFormat está errado. Se você passar um valor como “2.50”, ele irá mudar para 250.
Ou você passa “2,50” ou altera para :

ESSE DecimalFormat é que está errado. Uma vírgula, em um DecimalFormat, é um separador de milhares. Para especificar que o separador de milhares é um ponto e a vírgula ou ponto decimal é uma vírgula, deve-se usar:

Locale brazil = new Locale ("pt", "BR");
DecimalFormatSymbols dfs = new DecimalFormatSymbols (brazil);
DecimalFormat dateFormat = new DecimalFormat("#,##0.00", dfs);


Mas com o Locale “pt-BR” o resultado vai continuar como está.

EDIT: Ops, respondi antes do edit, podem ignorar essa resposta.

F

Tá no começo da Activity assim:

public static final DecimalFormat DINHEIRO_REAL = new DecimalFormat(  
		    "###,##0.00", new DecimalFormatSymbols(new Locale("en", "US")));
R
fbrigatt:
Tá no começo da Activity assim:
public static final DecimalFormat DINHEIRO_REAL = new DecimalFormat(  
		    "###,##0.00", new DecimalFormatSymbols(new Locale("en", "US")));
Tudo bem, só que na hora de fazer o parse, você instancia um novo DecimalFormat, ou você usar esse DINHEIRO_REAL para fazer o parse, ou adiciona o Locale ao outro.
F

Aqui que arrumo isso:

DecimalFormat dateFormat = new DecimalFormat("#,##0,00"); // AQUI QUE TROCO? COMO FICA COM ESSA LINHA NOVA QUE POSTOU AI? TO PERDIDO NOS FORMAT
 double doubleValue = 0;
 try {
		doubleValue = dateFormat.parse(valor.trim()).doubleValue();
       } catch (ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
      }
R

tem que instanciá-lo igual instanciou a DINHEIRO_REAL, aliás, pra que serve essa constante?

F

Cara, não é má vontade não, to perdido mesmo. Num to me achando mais.

Assim:

Locale us = Locale.US;  
 DecimalFormatSymbols dfs = new DecimalFormatSymbols (us);  
 DecimalFormat dateFormat = new DecimalFormat("#,##0.00", dfs); 
 double doubleValue = 0;

   try {
		doubleValue = dateFormat.parse(valor.trim()).doubleValue();
	} catch (ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}  
 total = qtde * doubleValue;
R

mas é só instanciar o dateFormat igual instancia o DINHEIRO_REAL, resumindo, do new pra frente os 2 tem que ser idênticos.

F

Tópico Resolvido. Obrigado.

Criado 13 de setembro de 2012
Ultima resposta 14 de set. de 2012
Respostas 29
Participantes 4