使用文档过滤器筛选多个句点(.)



假设用户必须在Jtext字段中输入一个Double值,然后进行计算。
但是,如果用户突然使用超过 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

我的建议是,您可以更改被覆盖的insertStringreplace方法,以便它检查在此插入之前是否插入了任何".",或者替换并更改过滤器,如果用户随后插入period字符时,"句点"将被空白字符串替换。我说明如下:

@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);
}

上面的代码只允许在设置此DocumentFilterDocument中插入一次"句点"。

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

最新更新