JAVAFx TextField验证十进制值

时间:2016-11-08 11:17:08

标签: java regex javafx

我尝试限制十进制数字的文本字段,我已经找到了整数验证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||.]", ""));
            }
        }
    });

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

5 个答案:

答案 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]

时,它也适用于整数