2 casas decimais com double

10 respostas
C

Olá pessoal blz?

Bom pessoal, eu quero formatar um valor double para exibir apenas 2 casas decimais, eu consegui formatar um valor double do jeito “pt” “Br” usando NumberFormat, mais dai o valor vira texto, tipo (R$ 20,00), e funciona assim, existe uma JTable onde eu adiciono os produtos, cada um com seu respectivo código, descrição, preço, e o usuário coloca a quantidade em outra célula, dai na ultima célula da linha da tabela, é calculado e exibido o valor referente ao preço do produto daquela linha * a quantidade, e depois disso, é feito uma varredura, em todas as linhas da tabela somando os valores desta ultima coluna, para calcular o total da venda, e é ai que ta o problema, se eu formatar o valor usando NumberFormat pra exibir o valor na JTable nao da certo, pois já não é possível converter novamente pra double na hora de calcular o total da venda, eu ainda nao descobri uma maneira de converter novamente pra double para efetuar o calculo, da pau por causa do R$.
E em todos os foruns de discussão que procurei, só falam sobre esse tal de NumberFormat, que funciona legal, porém funciona legal quando é a ultima coisa a ser feita, já no meu caso, que eu quero formatar o valor para exibir na tabela, e depois somar td denovo pra calcular o total, nao ajuda muito.

Existe aluma maneira de formatar o próprio valor no seu tipo double? sem precisar fazer essas formatações com NumberFormat.

Ou se alguem tiver outra ideia ou exemplo de código, será muito bem vinda !!!

Desde já grato !!! t+

10 Respostas

T

Claro, é só não guardar como double, e sim como String. :stuck_out_tongue: (Só que vai ficar alinhado à esquerda, o que provavelmente não é o que você espera).

Não confundir um número (idéia: 25) com o seu numeral ( 25 em decimal, 0x19 em hexadecimal, R$ 25,00 em moeda, XXV em algarismos romanos, “vinte e cinco” por extenso em português, “twenty-five” em inglês, “二十五” em caracteres chineses - todos representam a idéia “25”.)

Um double não contém informação de número de casas depois da vírgula ou símbolo de moeda. Ele é um numeral de ponto flutuante, só isso.

A

Usa um CellRenderer que voce consegue formatar o que é exibido sem alterar o tipo do atributo.

[]'s

C

Olá thingol, blz?

Não existe algum tipo em java pra tratar de moeda? Qual seria o melhor tipo a se usar quando se usa valores moeda, como no meu caso o real?

Eu ja tentei fazer um monte de coisas, até usei o NumberFormat pra formatar o valor, dai ele aparece assim, R$ 20,00, certinho do jeito que eu quero, mas é String, dai quando eu tentava pegar esse valor e somar aos demais valores das outras linhas da tabela nao é possível converter para o double que eu estou usando, então tentei até fazer uma gambiarra, fiz um método pra retirar o R e o $ da string e dai sim converto o valor pra double novamente, mas o valor total começou a ficar diferente do valor que realmente era pra dar a soma dos produtos.

Seria muito se eu te pedisse um exemplo de código thingol??

Quanto ao que vc sugeriu Alexandre, eu nunca trabalhei com CellRenderer, e nao tenho a miníma idéia de como fazer isso, se vc puder me ajudar um pouco mais com um exemplo de código seria ótimo.

Obrigado pelas respostas t+

T

Aqui neste fórum deve haver gente que vai lhe sugerir usar BigDecimal, ou então fazer as contas em centavos.

Mas de fato Java não é uma das melhores linguagens para usar para cálculos de moeda. (Normalmente eu usaria “double” e faria os devidos arredondamentos, mas isso é um porre, como você já deve ter descoberto.)

C

hehehe é um porre mesmo, mais blz intaum, vou ver o que posso fazer aqui.

Obrigado e t+

J

Acho que o que o Cleiton quer é saber usar a classe NumberFormat … então ai vai!

java.text.NumberFormat nf = java.text.NumberFormat.getNumberInstance(); nf.setMinimumFractionDigits(2); nf.setMaximumFractionDigits(2); String strValorFormatado = nf.format(1000); System.out.println(strValorFormatado);

:smiley:

I
jgbarros:
Acho que o que o Cleiton quer é saber usar a classe NumberFormat ... então ai vai!
java.text.NumberFormat nf = java.text.NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
String strValorFormatado = nf.format(1000);
System.out.println(strValorFormatado);

:D

Ressusitando o Topico, pessoal, estou com alguns problemas com formatação de moeda. primeiro problema resolvido, passar de double para valor.
import java.text.NumberFormat;

public class Valor {
public static void main(String args[]){
                    double valor = 1234567.89;
	    NumberFormat nf = NumberFormat.getInstance();
	    String numFormatado = nf.format(valor);
	    System.out.println(numFormatado); 
	}
}
minha duvida é a seguinte, como faço para pegar uma string formatada "1.234.567,89" e passar para double de maneira eficiente? criei um metodozinho que faz isso mas acredito que tenha outra forma mais eficiente:
String valor="1.234.567,89";
		String x="";//		
		char j[] = valor.toCharArray();
		
		for(int i=0;i<valor.length();++i){
			if(!(valor.substring(i,i+1).equals(".")||valor.substring(i,i+1).equals(","))){
				x+=j[i];
			}
			if(valor.substring(i,i+1).equals(",")){
				x+=".";
			}
		}
		double novoValor = Double.parseDouble(x);
		System.out.println(novoValor);

então, ai fica a duvida, como passar String "1.234.567,89" para double 1234567.89 para finalmente poder por no DB.

T

O “NumberFormat” tem ida e volta. A ida é o “format”, e a volta é o “parse”. O mesmo “NumberFormat” que você usou para formatar o número pode ser usado para desformatar o número. Exemplo:

NumberFormat nf = NumberFormat.getCurrencyInstance(new Locale ("pt", "BR")); 
String s = nf.format (12345.67); // s recebe "R$ 12.345,67"
double d = nf.parse (s).doubleValue(); // d recebe 12345.67

Talvez você tenha de pôr um “try/catch” em volta do nf.parse.

I

thingol:
O “NumberFormat” tem ida e volta. A ida é o “format”, e a volta é o “parse”. O mesmo “NumberFormat” que você usou para formatar o número pode ser usado para desformatar o número. Exemplo:

NumberFormat nf = NumberFormat.getCurrencyInstance(new Locale ("pt", "BR")); 
String s = nf.format (12345.67); // s recebe "R$ 12.345,67"
double d = nf.parse (s).doubleValue(); // d recebe 12345.67

Talvez você tenha de pôr um “try/catch” em volta do nf.parse.


Era justamente isso que eu estava precisando, realmente precisou usar try/catch no nf.parse.
obrigado!

N

Ola, o exemplo de Igor é, na minha opinião, o mais válido:

Este é um pedaço do código que uso:

NumberFormat formato = NumberFormat.getInstance(); formato.setMaximumFractionDigits(2); tfCelsius.setText(formato.format(celsius) + " ºC");

Criado 22 de janeiro de 2007
Ultima resposta 4 de abr. de 2013
Respostas 10
Participantes 6