Formatando variável double

Olá , amigos,

Eu estou tentando resolver este problema há muito tempo, mas não consigo. Como faço para formatar uma variável double, colocando a saída dela em um JLabel,mas com apenas duas casas decimais. Sei que tenho que usar a classe NumberFormat, usar setMinimumFractionDigits(2), faço tudo isso, mas não formata com duas casas decimais. Fiz um código, só pra entender esta questão.

Coloco um número em uma variável String, esse número vai para uma JTextField, quando eu clico em um JButton, o código converte a String da caixa de texto para variável double, e aí esse valor é enviado para uma Jlabel, mas formatando essa saída com duas casas decimais. Aparentemente tudo certo, mas não formata.

Na JTextField, eu coloco o valor 4.62768, isso entra na JTextField como String penso eu, mas quando clico no botão, meu código converte para double e uso o critério da NumberFormat para converter para setMinimumFractionDigits(2). Mas não faz, faz tudo, menos formatar para duas casas decimais, o número vira 4,628 (e, estranho, ainda acrescenta uma vírgula no lugar do ponto. Vejam parte do meu código :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.NumberFormat;

public class Formatando extends JFrame implements ActionListener
{
     JTextField T1;
     JLabel  L1;
     JButton B1, B2;
     NumberFormat df1;

     public Formatando()
         {
            setTitle("Formatando");
            setResizable(false);
            setSize(460,160);
            setLocation(60,60);
            getContentPane().setBackground(Color.lightGray);
            getContentPane().setLayout(new FlowLayout());       
            df1 = NumberFormat.getNumberInstance();      
            df1.setMinimumFractionDigits(2);            

            T1 = new JTextField("4.62768");
            L1 = new JLabel();

            B1 = new JButton("Transfere");
            B2 = new JButton("Sair");
            
             getContentPane().add(T1);         
             getContentPane().add(L1); 
             getContentPane().add(B1);
             getContentPane().add(B2);
             
             B1.addActionListener(this);
             B2.addActionListener(this);
        }

      
      public void actionPerformed(ActionEvent e)
         {
            
            if (e.getSource() == B1 )
              {
                 String A = T1.getText();                          
                 double B = Double.parseDouble(A);
                 L1.setText("Valor = " + df1.format(B));
              }
            
            if (e.getSource() == B2 )
              {
                  System.exit(0);
              }
         }
}

Se alguém souber onde estou errando, e puder me ajudar, agradeço muito, eu se que isso é primário, mas meu nível é primário também, já não tenho o que pensar para resolver isto, só com amigos!
Abraço,
Marco
[/code]

Falta essa linha aqui amigo

df1.setGroupingUsed(true);

Logo abaixo deste código

df1 = NumberFormat.getNumberInstance(); df1.setMinimumFractionDigits(2);

Coloca ela ae e vê se funciona !

Um Abraço.

Não sei nada sobre isso. Mas caso ingles não seja problema. Isso aqui deve resolver:

http://java.sun.com/docs/books/tutorial/uiswing/components/formattedtextfield.html

Ao dsfextreme, e ao rangel,

Quero agradecer a ajuda de vocês. No caso desse código:
df1.setGroupongUsed(true);
não funcionou, não modificou nada no resultado. Mas valeu a tentativa, amigo.

No caso da sua dica, Rangel, a coisa está ali sim, nessa parte do Tutorial, mas como meu inglês é devagar, fica difícil de entender onde está o ponto central da questão, mas vou estudar o Tutorial, porque não estou encontrando outro jeito. A questão é que tudo o que envolve moeda (R$), tem que ser configurado com saída para duas casas decimais, os centavos, ninguém vai na padaria e encontra um pão cotado a R$2,4287, mas sim, a R$2,43, não é mesmo? Então, esse assunto é super primário, mas não consigo resolver.

Agradeço a vocês dois a ajuda, e mando meu abraço.
Marco

Como já disse não domino o assunto, mas dei uma olhada no java doc e:

Vocé disse que continua a sair mais de dois digitos, pela minha logica você esta definindo que no minimo tera dois digitos.
Ex se o valor for 50 tera que sair 50.00.

Mas você não definiou o numero maximo de digitos (“setMaximumFractionDigits(int newValue)”).

Talvez seja isso ou não.

Não serve DecimalFormat? Exemplo:

[code]import java.text.DecimalFormat;

class A {
public static void main(String[] args) {
double x = 0.222543853489;
DecimalFormat df = new DecimalFormat(“0.00”);
System.out.println(df.format(x));
}
}[/code]

Rangel,

Faz muito sentido isso que você falou. Mas eu modifiquei o código incluindo essa opção setMaximunFractionDigits(2), e deu erro.

Bem, você tentou, colaborou , se esforçou, mas a coisa está difícil mesmo. Eu já mexi um pouco com VBA para fazer macro em EXCEL, já mexi com Delphi, Visual Basic, e sempre tinha que formatar essas duas casas decimais quando se trata de um campo moeda, e era super simples em todas essas linguagens , mas Java eu estou engatinhando ainda, e não peguei a coisa.

Eu tenho uma informação de um livro, que bastava importar java.text.NumberFormat, especificar um formato, exemplo,

NumberFormat df1

e no construtor colocar

df1 = NumberFormat.getNumberInstance();
df1.setMinimunFractionDigits(2);

instanciar e usar o método :
T1 = new JTextField();
T1.setText(" " + df1.format(valor));

Mas, eu fiz como está lá no meu código naquele post acima, e não funciona. Vamos ficar esperando que alguém possa dar uma luz. Mas, valeu sua ajuda, cara. Um grande abraço,
Marco

Ao Rangel,

Cara, você estava mais do que certo, e eu insisti no seu ponto de vista sobre usar aqueles dois métodos , o do Minimum e o do Maximum, era isso mesmo que tinha que fazer. Veja esse código abaixo:

import java.text.NumberFormat;

class DuasCasas
{
     public static void main (String args [])
         {
            
           double tax = 0.2975;
           double total = 4.62769;
            
            NumberFormat df1 = NumberFormat.getNumberInstance();
            df1.setMaximumFractionDigits(2);
            df1.setMinimumFractionDigits(2);

            System.out.println("Tax =" + df1.format(tax));
            System.out.println("Total =" + df1.format(total));
        }
}

O resultado vai ser:
Tax = 0,30
Total = 4,63

E se o cara quiser ver os valores com um sinal de cifrão antes do valor ($), basta usar getCurrencyInstance.

Agora, assunto encerrado, pra formatar double com casa decimal é isso aí acima. Valeu sua grande ajuda. Tô devendo essa! Abração.
Marco

[quote=SchuenemannPJ]Não serve DecimalFormat? Exemplo:

[code]import java.text.DecimalFormat;

class A {
public static void main(String[] args) {
double x = 0.222543853489;
DecimalFormat df = new DecimalFormat(“0.00”);
System.out.println(df.format(x));
}
}[/code][/quote]

Da certin tbm, e eu achei mais simples usar esse do q NumberFormat