JAVAFx TextFieldvalidation十进制值

我试着限制十进制数字的文本字段,我已经在这里找到了整数validation的解决方案,但问题是我无法转换以下代码的十进制数,如324.23,4.3,4,2, 10.43。 (只允许1个小数点)。

vendorList_textField_remaining.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (!newValue.matches("\\d*")) { vendorList_textField_remaining.setText(newValue.replaceAll("[^\\d||.]", "")); } } }); 

我也在寻找替代解决方案。 谢谢。

我遇到了同样的情况。 我想我找到了这个问题的解决方案。 正则表达式必须由新的替换,并由setText稍作更改。 现在它运作良好。 代码如下:

 vendorList_textField_remaining.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if (!newValue.matches("\\d*(\\.\\d*)?")) { vendorList_textField_remaining.setText(oldValue); } } }); 

jidefx-oss项目中有一些优秀的字段validation组件,包括一个十进制数字。

我试过这种方法:(1)在Textfield上 – 设置一个EventHandler(2)在处理程序中调用一个实用程序方法来判断Key是否有效

设置处理程序:

 txtField_Rate.setOnKeyTyped(new EventHandler() { @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(); } }); 

需要2个实用程序函数: – (1)isValidForDouble

 public static boolean isValid_forDouble( String oldText, String newChar, double limit ) { boolean valid = false; String newText = oldText + newChar; int maxDecimals = getDecimals(limit); int decimals = 0; if ( newChar.matches("[0-9]") ) { decimals = getDecimals(newText); if ( Double.valueOf(newText) <= limit ) if ( decimals <= maxDecimals ) valid = true; } if ( newChar.equals(".") ) { if ( !oldText.contains(".") ) valid = true; } return valid; } 

和(2)getDecimals()

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

感谢帮助。 我用解决方案(1)解决了我的问题。

 vendorList_textField_remaining.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if(!newValue.matches("\\d*(\\.\\d*)?")) { vendorList_textField_remaining.setText(oldValue); } } }); 

我知道这是一个老问题,但我有同样的问题,并找到了更好的解决方案。 我根据这个答案创建了简单的十进制字段。

它处理带负值的小数。 你可以放置和删除点或 – 即使你已经输入了一些数字,所以这是非常友好的使用。

它还只编译一次模式以确保更好的性能(当使用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] ”时,它也适用于整数