货币格式化程序不是用户友好/直观的。随机增加输入字段

Posted

技术标签:

【中文标题】货币格式化程序不是用户友好/直观的。随机增加输入字段【英文标题】:Currency Formatter not being user friendly/intuitive. Randomly increases the input field 【发布时间】:2014-03-17 04:12:10 【问题描述】:

我有一个JTextField,我用NumberFormatter 格式化。它工作得非常好,直到我尝试添加一个零,然后它将字段增加到 10,000 x 旧输入。这不是世界上最大的交易,只是试图以用户身份修复输入有点令人困惑。

已修复

如下所述,删除 setMaximumuFraction()/setMinimumFraction() 以及 setOverwriteMode() 使其像我希望的那样工作。

private void setValues()
    name = new JFormattedTextField();
    format = NumberFormat.getCurrencyInstance(Locale.US);
    format.setMinimumFractionDigits(2);
    format.setMaximumFractionDigits(2);
    formatter = new NumberFormatter(format);
    formatter.setMinimum(0.0);
    formatter.setMaximum(10000000.0);
    formatter.setAllowsInvalid(false);
    
    formatter.setOverwriteMode(true);
    price = new JFormattedTextField(formatter);
    price.setValue(0.0);

这是我当前的代码,我用

声明变量
private JFormattedTextField name, price;
private NumberFormat format;
private NumberFormatter formatter;

也许是因为我将 setMinimumFractionDigits() 设置为 2 或其他什么。

有什么想法吗?

编辑

这是工作代码的示例。只需要自己编译:

import java.awt.EventQueue;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.NumberFormatter;



public class testClass extends JPanel
    private JFormattedTextField name, price;
    private int option;
    private NumberFormat format;
    private NumberFormatter formatter;
    public testClass()
        initComponents();
        startPanel();
    
    
    private void initComponents()
        name = new JFormattedTextField();
        format = NumberFormat.getCurrencyInstance(Locale.US);
        format.setMinimumFractionDigits(2);
        format.setMaximumFractionDigits(2);
        formatter = new NumberFormatter(format);
        formatter.setMinimum(0.0);
        formatter.setMaximum(10000000.0);
        formatter.setAllowsInvalid(false);
        
        formatter.setOverwriteMode(true);
        price = new JFormattedTextField(formatter);
        price.setValue(0.0);
    
    
    private void startPanel()
        Object[] message = 
          "Item Name", name,
          "Item Price", price,    
        ;
        option = JOptionPane.showConfirmDialog(this, message, "New Customer Information", JOptionPane.OK_CANCEL_OPTION);
        
    
    
    
     public static void main (String[] args)
        try 
            for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) 
                if ("Nimbus".equals(info.getName())) 
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                
            
         catch (ClassNotFoundException ex) 
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
         catch (InstantiationException ex) 
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
         catch (IllegalAccessException ex) 
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
         catch (UnsupportedLookAndFeelException ex) 
            Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
        
        EventQueue.invokeLater(new Runnable() 
            public void run() 
                
                new testClass().setVisible(true);
            
        );
    

【问题讨论】:

"It works perfectly fine until I try adding a zero, then it increases the field to something like 10,000 x the old input." -- 请澄清这一点。还可以考虑创建和发布minimal example program。 @HovercraftFullOfEels 当然,我会建立一个快速程序。我的意思是因为它是NumberFormatter,它会主动更改输入字段,所以当我输入两个以上的数字时,它会从$0.00 变为$1,500.00 或类似的东西。因为它随机添加零。 【参考方案1】:

我认为这可以通过不将格式化程序的覆盖模式设置为 true 来解决。这些家伙也不应该是必需的:

format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);

因为 Locale.US 货币格式应该已经处理了这一点。


编辑:这是我用来测试您的代码的最小示例程序:

import java.text.NumberFormat;
import java.util.Locale;

import javax.swing.*;
import javax.swing.text.NumberFormatter;

public class TestList 
   static JFormattedTextField price;
   static NumberFormat format;
   static NumberFormatter formatter;

   public static void main(String[] args) 
      setValues();
      JPanel panel = new JPanel();
      panel.add(new JLabel("price:"));
      panel.add(price);

      JOptionPane.showMessageDialog(null, panel);
   

   private static void setValues()
      format = NumberFormat.getCurrencyInstance(Locale.US);
//      format.setMinimumFractionDigits(2);
//      format.setMaximumFractionDigits(2);
      formatter = new NumberFormatter(format);
      formatter.setMinimum(0.0);
      formatter.setMaximum(10000000.0);
      formatter.setAllowsInvalid(false);

      // formatter.setOverwriteMode(true);
      price = new JFormattedTextField(formatter);
      price.setColumns(10);
      price.setValue(0.0);
  

请注意,我删除了 name 字段,因为它与您的问题完全无关,并将所有内容设为静态,以便它可以在简单的静态 main 方法中运行。

【讨论】:

我现在试试这个 EDIT 好吧,谢谢它现在可以工作了。

以上是关于货币格式化程序不是用户友好/直观的。随机增加输入字段的主要内容,如果未能解决你的问题,请参考以下文章

如何将输出格式化为 UILabel 作为货币?

iOS 货币输入栏

使用美元符号和逗号格式化货币输入字段

VBA 中的 HTML - 无法将单元格格式化为数字/货币

本地化 NSLocal

尝试将 UITextField 格式化为像货币计算器一样仅用于 iOS 中的数字输入