2015-06-11 50 views
8

我有一个带有Locale.US的NumberFormat的JFormattedTextField。所以小数点分隔符是点,分组分隔符是逗号。NumberFormat解析不够严格

现在我在此文本字段中键入字符串“1,23”并将焦点移到另一个组件。我期望字符串消失(就像我在输入“a”而不是“1,23”时那样),因为它在使用Locale.US时显然不是数字的有效表示。但相反,文本字段中的文本更改为“123”。

这是因为在解析时使用的NumberFormat并不严格,而只是忽略了逗号。

问题:如何告诉NumberFormat在这种情况下抛出一个ParseException,这样在将焦点移动到另一个组件后文本字段将为空?

测试代码:

JDialog dialog = new JDialog(); 
    JPanel panel = new JPanel(new BorderLayout()); 
    dialog.getContentPane().add(panel); 

    NumberFormat nf = NumberFormat.getInstance(Locale.US); 
    JFormattedTextField textField = new JFormattedTextField(nf); 
    textField.setText("1,23"); 
    panel.add(textField, BorderLayout.CENTER); 
    panel.add(new JButton("focus"), BorderLayout.EAST); 

    dialog.pack(); 
    dialog.setVisible(true); 

移动焦点从文本字段的按钮和文本将变为“123”。

+1

这不是重复的。另一个问题是关于整数,而不是双打。这里的问题归结为一个超宽松的NumberFormat,它不检查是否允许该位置的逗号。看起来我们需要使用更严格检查的NumberFormat的子类。 –

+1

@RalfH:你说得对,这不是重复。我编辑了这个问题来显示JFormattedTextField中NumberFormat的底层用法。 –

+1

我如何从这个问题中删除重复标签?我想发布我自己的解决方案。 –

回答

3

我会建议你使用正则表达式,并使用匹配温控功能是这样的:

matches("\\d+([.,])?") 

此外,如果你会使用Integer.parseInt(String)将抛出一个异常,如果它会被解析,或者您可以使用Double.parseDouble(value)

0

实际上,Number只是Double的超级类别,所以你可以使用Double.parseDouble(...),然后自动拆箱。