Java 使用文档筛选器筛选多个期间(.)

Java 使用文档筛选器筛选多个期间(.),java,swing,jtextfield,documentfilter,Java,Swing,Jtextfield,Documentfilter,假设用户必须在Jtextfield中输入一个双精度值,然后进行计算。 但是,如果用户突然使用了超过1个句点,则会触发NumberFormatException,因此我假设解决方案是使用文档过滤器过滤掉任何额外的句点,或者捕获异常并通知用户无效的输入 当前使用DocumentFilter只允许数字和句点,但我的问题是如何过滤掉第二个句点 PlainDocument filter = new PlainDocument(); filter.setDocumentFilter(

假设用户必须在Jtextfield中输入一个双精度值,然后进行计算。
但是,如果用户突然使用了超过1个句点,则会触发NumberFormatException,因此我假设解决方案是使用文档过滤器过滤掉任何额外的句点,或者捕获异常并通知用户无效的输入

当前使用DocumentFilter只允许数字和句点,但我的问题是如何过滤掉第二个句点

PlainDocument filter = new PlainDocument();
            filter.setDocumentFilter(new DocumentFilter() {
                    @Override
                    public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) 
                    throws BadLocationException 
                    {
                    fb.insertString(off, str.replaceAll("[^0-9.]", ""), attr);
                    } 
                    @Override
                    public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) 
                    throws BadLocationException 
                    {
                    fb.replace(off, len, str.replaceAll("[^0-9.]", ""), attr);
                    }
            });

            apm.setDocument(filter);
范例

无效的 投入:1.2.2

有效的
输入:1.22

是,使用try-catch块。在try块中实现快乐路径(即正确格式化的数字),并在catch块中实现错误案例。例如,如果您想突出显示红色框或弹出错误消息,您可以将该逻辑放入(或从)catch块中调用。

我的建议是,您可以更改重写的
insertString
replace
方法,以便它检查是否有
在本次插入或替换之前已插入,并以一种方式更改过滤器,即如果用户随后插入
期间
字符,则“期间”将替换为空白字符串。我已举例说明如下:

@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) 
                throws BadLocationException {
    String regExp;
    Document doc = fb.getDocument();
    if(doc.getText(0, doc.getLength()).indexOf(".") == -1){
        regExp = "[^0-9.]";
    } else {
        regExp = "[^0-9]";
    }
    fb.insertString(off, str.replaceAll(regExp, ""), attr);
}

@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) 
                throws BadLocationException {
    String regExp;
    Document doc = fb.getDocument();
    if(doc.getText(0, doc.getLength()).indexOf(".") == -1){
        regExp = "[^0-9.]";
    } else {
        regExp = "[^0-9]";
    }
    fb.replace(off, len, str.replaceAll(regExp, ""), attr);
}

上述代码只允许在设置了此
DocumentFilter
文档中插入一次“period”。

不知道谈论什么,对我来说很有用,为了更好地帮助我尽快发布一个简短、可运行、可编译的筛选器,我会将筛选器编码为不允许第二个period。你试过什么?它怎么不工作?你好@mKorbel!我自己,我将等待SSCE。@HovercraftFullOfEels-im还使用DocumentListener计算值。或者使用
JFormattedTextField
,如图所示