我尝试限制十进制数字的文本字段,我已经找到了整数验证here的解决方案,但问题是我无法将以下代码转换为十进制数字,如324.23 ,4.3,4,2,10.43。 (只允许1个小数点)。
vendorList_textField_remaining.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if (!newValue.matches("\\d*")) {
vendorList_textField_remaining.setText(newValue.replaceAll("[^\\d||.]", ""));
}
}
});
我也在寻找替代解决方案。 感谢。
答案 0 :(得分:4)
我遇到了同样的情况。我想我找到了这个问题的解决方案。正则表达式必须由一个新的替换,并由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);
}
}
});
答案 1 :(得分:1)
jidefx-oss项目中有一些优秀的字段验证组件,包括一个十进制数字。
答案 2 :(得分:1)
我试过这种方法: (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();
}
});
需要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;
}
答案 3 :(得分:1)
感谢您的帮助。我用解决方案(1)解决了我的问题。
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);
}
}
});
答案 4 :(得分:0)
我知道这是一个老问题,但我遇到了同样的问题并找到了更好的解决方案。我基于this answer创建了简单的十进制字段。
它处理带负值的小数。你可以放置和删除点或 - 即使你已经输入了一些数字,所以这是非常友好的使用。
它还只编译一次模式以确保更好的性能(当使用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] ”
时,它也适用于整数