2

私が Java について読んだことのあるほとんどすべては、通貨に float または double を使用しないと述べていますが、小数点以下の桁数を持つ通貨値を入力/表示したい場合、Swing のすべてがまさにそれを強制しようとしているようです (別名まさにほとんどの人がやりたいことです)。

and とNumberFormat.getCurrencyInstance()一緒に使用できますが、 orを使用せずに小数点以下を表示する方法がわかりません。私は単純なものを見落としている必要があります。NumberFormatterJFormattedTextFieldFloatDouble

$1.55通貨フィールドを表示し、入力を受け入れ、入力を(セント)1.55の値を持つ整数として保存するにはどうすればよいですか?155

4

2 に答える 2

2

フォーマッタで計算を行うことはできません。すべきことは、価格をセント単位で保持する pojo のメンバー変数を用意することです。何かのようなもの:

private long priceInDollarCents;

次に、これをドルで返すゲッターを使用できます。何かのようなもの:

public double getPriceInDollars() {
    return (double)priceInDollarCents/100;
}

これは、フォーマッタに渡すものです。

于 2011-11-19T09:23:50.093 に答える
1

あなたはこのようなことをすることができます:

ここに画像の説明を入力してください

CustomizedField.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class CustomizedField extends JTextField
{
    private static final long serialVersionUID = 1L;

    public CustomizedField(int size)
    {
        super(size);
        setupFilter();
    }

    public int getCents()
    {
        String s = getText();
        System.out.println(s);
        if(s.endsWith(".")) s = s.substring(0, s.length() - 1);
        double d = Double.parseDouble(s) * 100;
        return (int) d;
    }

    private void setupFilter()
    {

        ((AbstractDocument) getDocument()).setDocumentFilter(new DocumentFilter()
        {

            @Override
            public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
            {
                check(fb, offset, text, attr);
            }

            @Override
            public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
            {
                check(fb, offset, text, attr);
            }

            private void check(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
            {
                StringBuilder sb = new StringBuilder();
                sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
                sb.insert(offset, text);
                if(!containsOnlyNumbers(sb.toString())) return;
                fb.insertString(offset, text, attr);
            }

            private boolean containsOnlyNumbers(String text)
            {
                Pattern pattern = Pattern.compile("([+-]{0,1})?[\\d]*.([\\d]{0,2})?");
                Matcher matcher = pattern.matcher(text);
                boolean isMatch = matcher.matches();
                return isMatch;
            }

        });
    }

}

Test.java

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Testing CustomizedField");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        final CustomizedField cField = new CustomizedField(10);
        final JTextField output = new JTextField(10);
        JButton btn = new JButton("Print cents!");
        btn.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent event)
            {
                output.setText(cField.getCents() + " cents");
            }
        });

        frame.add(cField);
        frame.add(btn);
        frame.add(output);
        frame.pack();
        frame.setVisible(true);
    }
}
于 2011-11-19T17:38:58.810 に答える