【问题标题】:NumberFormat parse not strict enoughNumberFormat 解析不够严格
【发布时间】:2015-08-27 06:33:43
【问题描述】:

我有一个 JFormattedTextField 和一个带有 Locale.US 的 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”。

【问题讨论】:

  • 这不是重复的。另一个问题是关于整数,而不是双精度数。这里的问题归结为一个过于宽松的 NumberFormat ,它不检查该位置是否允许使用逗号。看起来我们需要一个具有更严格检查的 NumberFormat 子类。
  • @RalfH:你是对的,这不是重复的。我已经编辑了问题以显示 JFormattedTextField 中 NumberFormat 的基本用法。
  • 我怎样才能从这个问题中删除重复的标签?我想发布我自己的解决方案。
  • 感谢您重新提出问题,但现在可以在stackoverflow.com/questions/33808144/… 下找到我的解决方案。

标签: java swing number-formatting jformattedtextfield


【解决方案1】:

我建议你使用正则表达式并像这样使用匹配函数:

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

此外,如果您将使用Integer.parseInt(String),则会在解析时抛出异常,或者您可以使用Double.parseDouble(value)

【讨论】:

    【解决方案2】:

    实际上,Number 只是 Double 的超类,因此您可以使用 Double.parseDouble(...),然后自动拆箱即可完成剩下的工作。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 2012-01-23
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2020-04-30
      • 2012-10-16
      相关资源
      最近更新 更多