Problemas com numeros double?

Salve galera…eu tenho o seguinte método.

public void somaColunaEntradaGrid(){        
        Locale local = new Locale("pt", "BR");
        NumberFormat formataValor = DecimalFormat.getCurrencyInstance(local);

        double totalGrid = 0;
        String valor = "";
        for(int x = 0; x < tabelaRegistros.getRowCount(); x++){
            valor = String.valueOf(tabelaRegistros.getValueAt(x, 6));
            totalGrid = totalGrid + Double.parseDouble(valor.replace(",", "."));
        }
        entrada.setText(formataValor.format(totalGrid));
        
    }

Esse método funciona bem se o numero for 999,99, se for por exemplo. 1.500,00 ja num funciona…Encontrei aqui no fórum um usuário que tinha o msm problema e disse que resolveu.

aqui o post: http://www.guj.com.br/posts/list/34925.java

Tentei seguir o exemplo e ainda naum consegui resolver, qquer ajuda será bem vinda.

obrigado.

O que você quer dizer com não funciona?

Se for o que estou pensando, deve estar acontecendo algo assim:

“900,00”.replace(",", “.”) --> “900.00"
“1.500,00”.replace(”,", “.”) --> “1.500.00” (Dá erro no format por que o ponto aparece duas vezes)

Acho que deveria trocar o:

totalGrid = totalGrid + Double.parseDouble(valor.replace(",", "."));Por:

Outra coisa, porque não faz com que seu TableModel retorne um double? Assim não precisa ficar trocando vírgula por ponto e etc.

opa Eric, eu disse o q naum funciona no primeiro post…é exatamente o valor 999,99 funciona.
Mas o valor 1.500,00 naum funciona, é o que estou tentando resolver.
Segui o seu post mas ainda não tive resultados.

qquer dica, posta aew.

obrigado

Sob que formato está o conteúdo da String recuperada da tabela?

Basicamente o currency instance de decimal format considera a unidade monetária. Por exemplo:

[code]String number = “1.500,00”;
String currency = “R$ 1.500,00”;

NumberFormat numberFormat = DecimalFormat.getInstance();
NumberFormat currencyFormat = DecimalFormat.getCurrencyInstance();

System.out.println(currencyFormat.parse(number)); // Ocorre um ParseException, pois number não possui a unidade monetária.
System.out.println(numberFormat.parse(number)); // Imprime 1500
System.out.println(currencyFormat.parse(currency)); // Imprime 1500[/code]
Dependendo da formatação que está sendo recuperada da tabela, terá que usar um number instance comum ao invés de currency instance.

Opa Eric, ainda não consegui resolver o problema, bem vou mostrar aqui um trecho simples de como estou tentando fazer. Sem usar uma JTable, apenas pegando valores de um JTextField

veja:

NumberFormat formataValor = DecimalFormat.getCurrencyInstance(new Locale("pt","BR"));

//pega valores
double valorTotalCompra = valorTotal.getText().replace(",","."); //valor total 1.000,00
double valorPagoCompra = valorPago.getText().replace(",","."); //valor pago 2.200,00
double troco = valorTotalCompra - valorPagoCompra; //aqui ja da erro

//exibe valores
valorTroco.setText(formataValor.format(troco)); //aqui ja da erro

//o erro retornado é
Exception occurred during event dispatching:
java.lang.NumberFormatException: multiple points
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1084)

Esse seria o problema que estou tendo…

qquer dica, agradeço !

obrigado.

Então, a String vem no formato “1.000,00”, certo? Quando se faz o replace, está trocando a vírgula por ponto, desta forma após o replace sua String será “1.000.00”. Pode ver que o próprio erro está dizendo que há múltiplos pontos, quando deveria haver apenas um.

[code]NumberFormat formataValor = DecimalFormat.getCurrencyInstance(new Locale(“pt”,“BR”));

//pega valores
double valorTotalCompra = Double.parseDouble(valorTotal.getText().replaceAll("\.", “”).replace(’,’, ‘.’)); //valor total 1.000,00
double valorPagoCompra = Double.parseDouble(valorPago.getText().replaceAll("\.", “”).replace(’,’, ‘.’)); //valor pago 2.200,00
double troco = valorTotalCompra - valorPagoCompra;

//exibe valores
valorTroco.setText(formataValor.format(troco));[/code]Primeiro removí os pontos que separam os milhares e em seguida substituí a vírgula por um ponto.

Mas pense no caso de modificar seu TableModel para retornar um double, já que está trabalhando com valores double.

Opa Eric, seu ultimo post resolveu meus problemas…bem, mas eu naum entendi o pq de usar “\.” ao inves de so “.” no replaceAll. Vc poderia me explicar isso ?

obrigado.

O primeiro argumento do método replaceAll recebe uma regex (expressão regular). Para uma expressão regular, o ponto casa com qualquer caractere, e para representar um ponto literalmente é preciso mandar um “.” para a regex. E para representar “” em uma String precisa usar “\”, por isso “\.”.

No caso do replace, não é necessário, pois ele usa char e não regex. Mas como o char não pode ser vazio, usei o replaceAll mesmo.

opa…Eric, obrigado !

Sua dica me salvou de ter q reescrever muita coisa…obrigado !

Cuidado ao usar double para valores monetários. Por ser um tipo de ponto flutuante, erros de arredondamento podem ocorrer. Prefira java.math.BigDecimal.