JAVAFx文本字段验证十进制值
我试图限制十进制数的textfield,我已经找到了整数验证的解决方案,但问题是我无法将以下代码转换为十进制数,比如324.23、4.3、4、2、10.43。(仅允许1个小数点)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)项目中有一些优秀的字段验证组件,包括一个用于十进制数的组件。我尝试了这种方法:
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();
}
}
}