JAVAFx文本字段验证十进制值

JAVAFx文本字段验证十进制值,java,regex,javafx,Java,Regex,Javafx,我试图限制十进制数的textfield,我已经找到了整数验证的解决方案,但问题是我无法将以下代码转换为十进制数,比如324.23、4.3、4、2、10.43。(仅允许1个小数点) vendorList\u textField\u remaining.textProperty().addListener(新的ChangeListener()){ @凌驾 public void changed(observevalue)项目中有一些优秀的字段验证组件,包括一个用于十进制数的组件。我尝试了这种方法:

我试图限制十进制数的textfield,我已经找到了整数验证的解决方案,但问题是我无法将以下代码转换为十进制数,比如324.23、4.3、4、2、10.43。(仅允许1个小数点)

vendorList\u textField\u remaining.textProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observevalue)项目中有一些优秀的字段验证组件,包括一个用于十进制数的组件。

我尝试了这种方法: (1) 在Textfield上-设置EventHandler (2) 在处理程序中调用实用程序方法以确定该键是否有效

设置处理程序:

txtField_Rate.setOnKeyTyped(new EventHandler<KeyEvent>() 
{
    @Override
    public void handle(KeyEvent ke) 
    {
        String character = ke.getCharacter();
        String text = txtField_Rate.getText();

         if ( !LM_Utility.isValid_forDouble(text, character, 99.99) )
             ke.consume(); 
    }
});

我也遇到过同样的情况。我想我已经找到了解决这个问题的方法。正则表达式必须被一个新的正则表达式所取代,并由setText进行了一些更改。目前它运行良好。代码如下:

vendorList_textField_remaining.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            if (!newValue.matches("\\d*(\\.\\d*)?")) {
                vendorList_textField_remaining.setText(oldValue);
            }
        }
    });
vendorList\u textField\u remaining.textProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(observeValue感谢您的帮助。我已使用解决方案(1)解决了我的问题

vendorList\u textField\u remaining.textProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(ObservalEvalue我知道这是一个老问题,但我也有同样的问题,并找到了更好的解决方案

它处理带负数的十进制数。即使已经输入了一些数字,您也可以放置和删除点或,所以这是非常友好的

它还只编译一次模式以确保更好的性能(当使用text.matches(“regex”)时,每次有人键入字符时都会编译模式)

当您声明这样的类时,您可以在fxml文件中使用它,就像它是标准的JavaFX组件一样

public class DecimalField extends TextField {

private static Pattern decimalPattern = Pattern.compile("[-]?[0-9]*(\\.[0-9]*)?");

@Override
public void replaceText(int start, int end, String text) {
    if (validate(start, text)) {
        super.replaceText(start, end, text);
    }
}

@Override
public void replaceSelection(String text) {
    if (validate(Integer.MAX_VALUE, text)) {
        super.replaceSelection(text);
    }
}

private boolean validate(int start, String text) {
    String currentText = isNull(getText()) ? "" : getText();
    if(start == 0) { //to handle "-1.1" or ".1" cases
        return decimalPattern.matcher(text + currentText).matches();  
    } else {
        return decimalPattern.matcher(currentText + text).matches();
    }
}

}

当您将模式更改为“[-][0-9]”时,它也适用于integer。如果您想替换第二个,您需要一个“回头看”。为什么不使用微调器?情况如何?请提供一个测试用例。另外,请尝试
.replaceAll(^(\\d*\.\\d)”,“$1”)
@WiktorStribiżhmm,可能
.replaceAll(^(\\d*\.\\d*.\\d*),“$1”)
会做得更好……替代解决方案:我已经在评论中从@WiktorStribizew那里得到了正确的答案,谢谢。
private static int getDecimals(String value)
{
    int integerPlaces = 0;
    int decimalPlaces = 0;

    if (value.contains("."))
    {
        integerPlaces = value.indexOf('.');
        decimalPlaces = value.length() - integerPlaces - 1;
    }

    return decimalPlaces;
}
vendorList_textField_remaining.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            if (!newValue.matches("\\d*(\\.\\d*)?")) {
                vendorList_textField_remaining.setText(oldValue);
            }
        }
    });
vendorList_textField_remaining.textProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        if(!newValue.matches("\\d*(\\.\\d*)?")) {
            vendorList_textField_remaining.setText(oldValue);
        }
    }
});
public class DecimalField extends TextField {

private static Pattern decimalPattern = Pattern.compile("[-]?[0-9]*(\\.[0-9]*)?");

@Override
public void replaceText(int start, int end, String text) {
    if (validate(start, text)) {
        super.replaceText(start, end, text);
    }
}

@Override
public void replaceSelection(String text) {
    if (validate(Integer.MAX_VALUE, text)) {
        super.replaceSelection(text);
    }
}

private boolean validate(int start, String text) {
    String currentText = isNull(getText()) ? "" : getText();
    if(start == 0) { //to handle "-1.1" or ".1" cases
        return decimalPattern.matcher(text + currentText).matches();  
    } else {
        return decimalPattern.matcher(currentText + text).matches();
    }
}

}