Java.lang.NumberFormatException

56 respostas
F

Caros amigos,

Estou fazendo o seguinte:

Tenho uma TextView que recebe um valor, float. Tenho um EditText que digito a quantidade. Quero fazer Quantidade * Valor e ta dando java.lang.NumberFormatException

Aqui tá o código:

qtde = Integer.valueOf(Quantidade.getText().toString()); // Pego a quantidade
Log.i("Quant","Quantidade: " + qtde); // Mostra no LogCat
 				 
valor = Preco.getText().toString(); // Pego o valor
Log.i("Preço","Preço: " + valor); // Mostra no LogCat
				
total = qtde * Float.parseFloat(valor.trim()); // Quero fazer o cálculo aqui, mas  erro

Alguém me ajuda?? Declarei as variáveis assim:

private String valor;

private int qtde = 0;
private float vPreco = 0;
private float total = 0;

56 Respostas

R

qual o valor que você envia para o parseFloat? Lembre-se que se for um valor numérico separado por vírgulas, você precisa tratar isso. O padrão do java é separar as casas decimais com o ponto.

F

Tá com virgula, agora que vi lá. Como arrumo isso?

E

Outra coisa, evite usar float.
Use sempre double (dá bem menos dor de cabeça com contas erradas), e se for fazer contas com dinheiro e não precisar usar raízes quadradas e outras operações mais complicadas, use BigDecimal.

R

qual o valor?

é na linha do parseFloat mesmo que é lançada a exceção ?

E

Que nada, a conta está certa. Provavelmente, nessa variável, tem alguma coisa que você não está esperando (espaços a mais também podem atrapalhar, por exemplo).

F

Tá trazendo assim: Exemplo: 3,50 no valor.

To querendo fazer a conta Quantidade * Valor.

R

você pode usar o DecimalFormat
Não sou muito bom com ele, mas acho que assim funciona:DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("pt", "BR")); DecimalFormat decimalFormat = new DecimalFormat("###,##0.00", symbols);EDIT: Aliás, nem precisa do DecimalFormatSymbols, tente só assim: DecimalFormat decimalFormat = new DecimalFormat("###,##0.00");

E

Eu estou dizendo que é para você melhorar seus óculos. Para Double.parseDouble ou Float.parseDouble funcionar, você precisa escrever “3.50”, não “3,50” (veja a pequena perninha da vírgula : )

Se você precisa trabalhar com vírgulas (afinal de contas, estamos no Brasil) você pode usar alguma outra função do Java que entenda vírgulas, não Double.parseDouble ou Float.parseDouble. Ou então você pode trocar as vírgulas por pontos… mas esse campo de moeda vem também com pontos, como “1.234,56” ?

F

Vou Testar e ja posto o resultado.

F

Erro ainda.

E

“Erro ainda” não é resposta. Diga pelo menos “é o mesmo erro” ou “apareceu outro erro, que é…” e poste o stack trace.

F

Estou executando para pegar o erro no logCat, um momento. Desculpe.

F

O mesmo erro:

java.lang.NumberFormatException

To fazendo assim para formatar o valor:

private static final Locale BRAZIL = new Locale("pt","BR");  
	public static final DecimalFormat DINHEIRO_REAL = new DecimalFormat("###,###,##0.00");

	public static String mascaraDinheiro(double valor, DecimalFormat moeda){     
		return moeda.format(valor);     
	}
R

Ué, o problema não estava em converter uma String para float?

F

Então, é, mas ta dando erro ainda. Postei o código que formata o valor.

R

O código que está dando erro usa esse método de conversão?

esse método retorna uma String não retorna? não acho que o erro esteja aí

F

Mudei para:

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

Ainda traz com no tipo 3,50. Tá dando o erro java.lang.NumberFormatException ainda.

R

mas como ficou o código? você ainda usa parseFloat ?

F

Dá erro quando executa essa linha:

private int qtde = 0;
private double vPreco = 0;
private double total = 0;


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

total = qtde * Double.parseDouble(valor.trim());

No logCat tá mostrando os valores.

R

cara, de nada adianta usar o pattern correto no DecimalFormat se você não utiliza ele, tem que utilizá-lo na conversão:DecimalFormat dateFormat = new DecimalFormat("#,##0.00"); double valorDouble = dateFormat.parse(valor.trim()); total = qtde * valorDouble;

F

Vou ja testar e posto, um momento. Obrigado pela dica.

F

Erro nesse trecho:

= dateFormat.parse(valor.trim());

Type mismatch: cannot convert from Number to double

R

a classe Number tem um método que retorna um tipo mais específico, Number.xxxValue(), existe um para cada subtipo.

no seu caso use doubleValue();

F

Como arruma isso?

Seria assim:

double valorDouble = Double.valueOf(valor.trim());

R

o método parse retorna um Number, portanto você precisa transformá-lo no tipo específico que quer, pode fazer um cast, ou usar os métodos que ele te disponibiliza. Number number = decimalFormat.parse(valor.trim()); double doubleValue = number.doubleValue(); Isso é a mesma coisa que fazer: double doubleValue = decimalFormat.parse(valor.trim()).doubleValue(); Você é novo em Java?

F

Mais ou menos. To aprendendo aos poucos.

F

Tá dando erro na linha:

double doubleValue = decimalFormat.parse(valor.trim()).doubleValue();  
  total = qtde * valorDouble;

decimalFormat e valorDouble

decimalFormat cannot be resolved
valorDouble cannot be resolved to a variable

R

decimalFormat tem que ser substituído pela sua instância de DecimalFormat

e o doubleValue é o que você vai usar na multiplicação.

F

Fiz assim e funcionou:

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;

Se quiser no formato tipo 35.00, como faz? Tá fazendo assim 35.0

R

Como é um tipo numérico, pouco importa se ele é 35.0 ou 35.00, pois os dois possuem o mesmo valor.

Agora se quiser formatar para a view, precisa transformá-lo de novo em String.

F

Ok, como faria para converter em string novamente, só para saber.

F

Como converter o total do código abaixo para String?

DecimalFormat dateFormat = new DecimalFormat("#,##0.00");  
 double doubleValue = 0;
 try {
    doubleValue = dateFormat.parse(valor.trim()).doubleValue();
 } catch (ParseException e) {
    e.printStackTrace();
 }  
  total = qtde * doubleValue;
R
fbrigatt:
Como converter o total do código abaixo para String?
DecimalFormat dateFormat = new DecimalFormat("#,##0.00");  
 double doubleValue = 0;
 try {
    doubleValue = dateFormat.parse(valor.trim()).doubleValue();
 } catch (ParseException e) {
    e.printStackTrace();
 }  
  total = qtde * doubleValue;
Use o método format.

Eu sugiro que leia a API da classe DecimalFormat, vai te poupar muita dor de cabeça.

F

Opa, fiz assim, pode ser:

Tot = String.valueOf(total);

Uma pergunta a mais, como gravo data? Pode ser assim:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
dateFormat.applyPattern("yyyy-MM-dd");
R

Isso aí já é uma dúvida pra outro tópico :slight_smile: marque esse como resolvido se não tem mais dúvidas relacionadas ao assunto inicial do tópico, e se não encontrar o que quer relacionado às datas, abra um tópico novo

F

To ficando loko, meu amigo. No MySql o campo preço ta como decimal, 10,2 o valor, correto? Tenho um valor cadastrado lá com 2.50. Mostra na tela 2.50 num TextView e faço até a conta multiplicando pela quantidade, ok.

Quando vou gravar o preço no banco ele grava 2.00

Que to fazendo de errado?

To pegando o valor aqui:

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

E passo como parametro aqui:

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

Ajuda que ja não sei o que fazer mais, por favor.

F

O problema ta no banco ou no código? To perdido.

R

Não sei, que valor vem nesse valor1.toString() ?

como você disse que envia o valor para ser persistido pelo PHP, o problema pode estar lá.

quando você recupera do outro lado, o valor está correto?

F

Valor1 é a captura do preço no TextView. Entendeu?

O php é esse:

<?php
  //$usuario=$_GET['usuario'];
  //$senha  =$_GET['senha'];
  $id_produto=$_POST['id_produto'];
  $id_categoria =$_POST['id_categoria'];
  $data =$_POST['data'];
  $preco  =$_POST['preco'];
  $qtd=$_POST['qtd'];
  $total  =$_POST['total'];
  $nr_mesa=$_POST['nr_mesa'];
  $id_usuario  =$_POST['id_usuario'];

  $conexao = mysql_connect('localhost','root','');
  mysql_select_db('bdfss',$conexao);

  $sql = "insert into pedidos_efetuados (
          id_produto, id_categoria, data,
          preco, qtd, total, nr_mesa, id_usuario)
          values ('$id_produto','$id_categoria','$data','$preco','$qtd','$total','$nr_mesa','$id_usuario')";

  $resultado = mysql_query($sql) or die ("Erro .:" . mysql_error());

  if($resultado)
      echo "1";
  else
      echo "0";

?>
R

Eu entendi, mas eu quero saber qual é esse valor. Qual o valor exato que está sendo enviado, e qual o valor exato que está sendo recuperado do outro lado?

F

Ta mostrando pra mim 2.50. O valor correto. Quando grava que faz errado.

R

dê um echo na query e cole ela aqui pra gente ver.

F

Assim, mas executando né?

echo $sql

R

Isso, quero ver como ficou a query final

F

Mas funciona executando pelo android o echo?

Nunca fiz isso. Passo por parametros.

Fiz na mão assim:

insert into pedidos_efetuados ( id_produto, id_categoria, data, preco, qtd, total, nr_mesa, id_usuario) values (’’,’’,’’,’’,’’,’’,’’,’’) (bdfss.pedidos_efetuados, CONSTRAINT pedidos_efetuados_ibfk_1 FOREIGN KEY (ID_PRODUTO) REFERENCES produtos (ID_PRODUTO))

To passando os parametros na mão pra ver se imprime.

R

Bom, não sei nada do ambiente que você está utilizando, mas dê um jeito de conseguir a query :slight_smile:

F

Vou pegar o valor da sql no logCat

resposta= 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’)1

R

Tente executar essa query direto no MySQL e veja se ele grava corretamente, se o valor for gravado incorretamente, o problema está no banco.

F

Ok, vou testar agora

F

Testei. Executei:

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’)

e gravou 2.00

R

O problema está no banco então :slight_smile:

Acho que esse post já foi bem longe do problema inicial

F

Tá decimal(10,2) lá no mysql. Pra encerrar.

F

Quer que abra outro?

R

É melhor, porque não entendo de MySQL pra resolver seu problema, talvez quando você abrir um tópico pra esse problema específico apareça alguém que tenha a solução.

F

Não seria formatar o valor, pq ta como string, não é?

A

suponho que seu EditText se chame “Preco” então, se fizer assim:

a pessoa só vai conseguir digitar números e informar os decimais usando “.”

você pode ver mais opções neste link http://developer.android.com/reference/android/text/InputType.html#TYPE_NUMBER_FLAG_DECIMAL

Criado 11 de setembro de 2012
Ultima resposta 20 de set. de 2012
Respostas 56
Participantes 4