gpt4 book ai didi

java - JFormattedTextField 严格解析数字格式

转载 作者:行者123 更新时间:2023-11-30 07:46:54 26 4
gpt4 key购买 nike

由于有人错误地将我的另一个问题( NumberFormat parse not strict enough )标记为重复,并且尽管我指出它是不同的但没有删除重复的标签,所以我将再次发布该问题以及我的解决方案。也许这对某人有帮助。我们开始吧:

我有一个 JFormattedTextField,其 NumberFormat 为 Locale.US。因此小数点分隔符是点,分组分隔符是逗号。

现在,我在此文本字段中键入字符串“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”。

最佳答案

这是我的解决方案:

首先,我创建一个经过严格解析的自定义 DecimalFormat。只允许使用数字且最多一位小数。

    public class StrictDecimalFormat extends DecimalFormat {

private static final Pattern NUMBER_PATTERN = Pattern.compile("^\\d*[.]?\\d*$");

public Number parse(String text, ParsePosition pos) {
Matcher matcher = NUMBER_PATTERN.matcher(text);
if (matcher.matches()) {
return super.parse(text, pos);
}
return null;
}
}

现在我将这种十进制格式用于我的 JFormattedTextField。由于语言环境本身无法设置为十进制格式,因此我必须创建适当的 DecimalFormatSymbols 并设置它。

    DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(Locale.US);
DecimalFormat strictFormat = new StrictDecimalFormat();
strictFormat.setDecimalFormatSymbols(decimalFormatSymbols);

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

JFormattedTextField textField = new JFormattedTextField(strictFormat);
textField.setText("1,23");
panel.add(textField, BorderLayout.CENTER);
panel.add(new JButton("focus"), BorderLayout.EAST);

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

关于java - JFormattedTextField 严格解析数字格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33808144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com