Então, eu construi um pequeno projeto no qual o usuário tem disponível um Jframe (interface) no qual possui um jTextField para este entrar com um valor em dinheiro (reais), por exemplo: 5,00 ou 4567,54.
Eu devo validar as duas casas decimais e a virgula, como eu faço isto?
Eu havia pensado na seguinte função de verificação:
[code]
private boolean verificarPrecoPreenchido() {
//funçao verificará se o campo preco foi preenchido
DecimalFormat decimal = new DecimalFormat(“0.00”); // verica se valor é decimal
boolean retorno = false;
String precoProduto = jFormattedTextFieldValorProduto.getText();
//isEmpty(): Função que verifica se uma variável está vazia (incluindo espaços em branco).
//retorna: VERDADEIRO se está vazio; FALSO caso contrário.
Double dPrecoProduto = Double.parseDouble(precoProduto);
String sPrecoProduto = decimal.format(dPrecoProduto);
boolean virgula = precoProduto.contains(",");
if ((precoProduto.isEmpty() == true)||((!sPrecoProduto.equals(precoProduto)) == true)||(virgula == false)) {
retorno = false;
} else {
retorno = true;
}
return retorno;
} [/code]
Porém o seguinte erro está sendo apresentado: Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException
DecimalFormat tem um método chamado parse. É ele que você deve usar para validar as tais “casas decimais”.
Dê uma olhada neste código, que postei faz poucos dias:
/**
*
*/
package guj;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.util.Locale;
import javax.swing.JOptionPane;
/**
*/
public class ExemploDecimalFormat {
/**
* @param args
*/
public static void main(String[] args) {
Locale ptBR = new Locale ("pt", "BR");
DecimalFormat df = new DecimalFormat ("#,##0.00", new DecimalFormatSymbols (ptBR));
double margem = 0;
double valor = 0;
String strMargem, strValor;
boolean ok = false;
do {
strMargem = JOptionPane.showInputDialog(null, "Entre com a margem em porcentagem (exemplo: 5,00 )");
try {
margem = df.parse(strMargem).doubleValue();
ok = true;
} catch (ParseException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog (null, "ERRO - Entre com um valor válido para a margem. Exemplo: 5,00");
}
} while (!ok);
ok = false;
do {
strValor = JOptionPane.showInputDialog(null, "Entre com o valor em reais (exemplo: 1.000,00 )");
try {
valor = df.parse(strValor).doubleValue();
ok = true;
} catch (ParseException ex) {
JOptionPane.showMessageDialog (null, "ERRO - Entre com um valor válido. Exemplo: 1.000,00");
}
} while (!ok);
double valorCalculado = margem / 100.0 * valor;
String resposta = String.format (ptBR, "Usando a margem de %.2f %% sobre o valor de %.2f, o resultado é %.2f",
margem, valor, valorCalculado);
JOptionPane.showMessageDialog (null, resposta);
}
}
[quote=digaoneves]O que você quer dizer com validar as duas casas decimais e a virgula?
Indique a linha onde ocorre o erro também.[/quote]
Então, quando eu digo validar é porque eu quero verificar se o número que o usuário entrou possui duas casas decimais e vírgula, como por exemplo: 3,25.
digaoneves , eu inseri as linhas de código que você solicitou, porém agora o erro apenas apresenta quando eu entro com um valor assim: 12,07.
Erro: Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: “12,07”
Você declarou o seu DecimalFormat como o entanglement sugeriu? Locale ptBR = new Locale ("pt", "BR");
DecimalFormat df = new DecimalFormat ("#,##0.00", new DecimalFormatSymbols (ptBR)); Porque um double normalmente não vai aceitar um valor separado por vírgula, visto que o padrão é a separação por ponto. double d1 = 10.45; // OK
double d2 = 10,45; // Erro Porém setando o DecimalFormatSymbols com o Locale “pt-BR”, o parse funcionaria com a vírgula.
Pessoalllll… resolvi meu problema através do conhecimento do digaoneves e do entanglement. O grande problema era: double normalmente não vai aceitar um valor separado por vírgula.