java - Formatação de campo para valores com moeda
Perguntas � java � Formatação de campo para valores com moeda
Formatação de campo para valores com moeda
Pessoal estou formatando um campo para que ele fique como moeda com o metodo abaixo porem quando é valores pequenos ele formata normal, mas quando coloca numeros maiores ele da esse erro aqui. Existe algum geito de formatação para moeda que aceite varios digitos?
NumberFormat formato = NumberFormat.getCurrencyInstance(ptBr);
A exceção java.lang.NumberFormatException: multiple points provavelmente esta acontecendo porque você deve estar fazendo um parseDouble passando uma String com formato brasileiro e este método espera um formato americano.
Double.parseDouble("1.000.000,00"); //Errado e estoura  java.lang.NumberFormatException: multiple points
Double.parseDouble("1000000.00");  //FORMA CORRETA
Em primeiro lugar destaco que valores monetários devem ser tratados com o BigDecimal pois ele te permite escolher qual a precisão( quantidade de dígitos ) que serão usadas. O Paulo Silveira escreveu a algum tempo um artigo chamado Arredondamento e números gigantes: do double ao BigDecimal que mostra o erro clássico abaixo:
//O resultado é 0.30000000000000004
Diante disto, não use Double para representar valores monetários! :-)
Caso queria uma opção mais produtiva e especializada, existe um wrapper que trata valores monetários em Java e vale a pena dar uma olhada: JSR 354 - Currency and Money.
Mas vamos lá, usando o bom e velho Bigdecimal você poderia fazer assim:
BigDecimal valor = new BigDecimal ("12000000.12");
//O resultado é R$ 12.000.000,12
Muito boa sua resposta, porem não marquei como correta ainda, pq eu preciso faze uma operação dividir o valor total pelo numero de parcelas, mas com o bigDecima não consigo fazer esse operaçao. Alguem sabe como fazer?
— IkeSilva 25 de abr de 2013
@IkeSilva para divisão com BigDecimal dá uma olhada nessa documentação do BigDecimal e olha o método divide disponível. Qualquer dúvida posta ai! :-D
— pvrsouza 25 de abr de 2013
Eu fiz com esses números todos e não deu problema. Lembrando que o getCurrencyInstance pega o locale default.
Long a = Long.parseLong("999999999999999999");
System.out.println(NumberFormat.getCurrencyInstance().format(a));
//saída R$ 999.999.999.999.999.999,00
Kleber Damasco
Nao concordo com o uso do Long. Se vc colocar mais um dígito na sua String já vai estourar java.lang.NumberFormatException: For input string: "9999999999999999999". Mais um motivo para usar o BigDecimal.
Não foi um pedido de aprovação, foi apenas uma ideia para mostrar que funciona!
— Kleber Damasco 25 de abr de 2013
Apesar de concordar com o uso do BigDecimal mencionado pelo @pvrsouza, o NumberFormat também pode ser utilizado através do método parser (que faz o inverso do format).
NumberFormat.getCurrencyInstance(
new Locale("pt", "BR"));
Number number =
numberFormat.parse("R$ 1.000,10");
System.out.println(number.getClass());
BigDecimal.valueOf(number.doubleValue());
O parser retorna, para este caso, um Double (classe-filha de Number). Se quiser poderá fazer um cast (mas eu prefiro a forma que coloquei acima, utilizando o doubleValue)
Lembrando que este é apenas outro caminho.
O parse usando o NumberFormat resolve o problema do java.lang.NumberFormatException: multiple points. Bem lembrado.
DecimalFormat aceita converter diretamente para BigDecimal, dispensando a parte do "doubleValue" que foi mostrada acima. É só usar setParseBigDecimal (true) (veja http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html#setParseBigDecimal%28boolean%29 ) e fazer o cast do Number retornado para um BigDecimal.
Para formatação de valores eu faço o seguinte tenho uma classe utilitaria para fazer a conversão para mim o codigo é esse
public static String format(BigDecimal valor,String formato) {
java.text.DecimalFormat df = new java.text.DecimalFormat(formato);
E o valor que eu passo na na String formato é isso = "##0.00" e formata certinho os valores da uma testada nisso com certeza ira funcionar para voce....
Isso resolve o seu problema,
http://javaaberto.blogspot.com.br/2012/07/mascara-para-formato-real-em-jtextfield.html
Isto não é um arredondamento e sim uma máscara. Pode ser aproveitado pelo fato de citar o DecimalFormat, NumberFormat, etc mas acho muito complexo para a questão.
Pessoal sei que é antigo este tópico. Mas como é muito útil, segue minha pegunta. A maioria dos usuários digitam ","(virgula) ao invés do (ponto). Neste caso, todas as formas pelo que vi, darão erro. Como corrigir isto ?