【问题标题】:Allow only one decimal point in EditText在 EditText 中只允许一位小数
【发布时间】:2022-01-22 18:17:11
【问题描述】:

我正在尝试向我的 EditText 添加一个 InputFilter,它必须只允许整数或只有一个小数点的小数。

接受的输入必须是:

1 - 12 - 3.33 - 4.20 etc.

拒绝:

.0 - 5. - 5.5.5 - 40.21.1 etc.  

我创建了一个自定义 InputFilter 来检查输入是否符合 RegExp ^\d+(\.\d+)?$

但 EditText 总是显示一个空字符串,在调试中“spanned”总是空的,而默认情况下 EditText 有一个起始值。

过滤器:

public class DecimalDigitsFilter implements InputFilter {
    @Override
    public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
        Pattern pattern = Pattern.compile("^\\d+(\\.\\d+)?$");
        Matcher matcher = pattern.matcher(spanned);
        if (!matcher.matches()){
            return "";
        }
        return null;
    }
}

活动:

quantita.setFilters(new InputFilter[] {new DecimalDigitsFilter()});

【问题讨论】:

    标签: android regex


    【解决方案1】:

    您需要针对EditText 中的实际文本运行匹配器:

    public class DecimalDigitsFilter implements InputFilter {
        @Override
        public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
            Pattern pattern = Pattern.compile("^\\d+(\\.\\d+)?$");
            Matcher matcher = pattern.matcher(spanned.getText());
            if (!matcher.matches()){
                return "";
            }
    
            return null;
        }
    }
    

    【讨论】:

    • cherSequence 只包含新添加的字符
    • 尝试使用spanned.getText()。如果这个 also 不起作用,那么方法签名没有您需要的文本。
    • 这是我第一次制作这样的自定义过滤器,所以我不知道如何获取它,但无论如何我通过在TextChangedListener > afterTextChanged 中设置模式检查解决了这个问题,因为在这里我可以访问整个字符串。
    【解决方案2】:

    我不得不在 TextChangedListener 中移动 mo 逻辑,就像在 InputFilter 中一样,我无法将整个字符串放在哪里来检查我的 RegExp。

    此外,我什至不得不更改我的 RegExp 有点像这样^\d+(\.([\d+]+)?)?$ 我必须将小数点后的值设置为可选,否则每次我写小数点时.matches() 都会失败。

    所以最终的代码是这样的:

    quantita.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
        }
    
        @Override
        public void afterTextChanged(Editable editable) {
            Pattern pattern = Pattern.compile("^\\d+(\\.([\\d+]+)?)?$");
            Matcher matcher = pattern.matcher(quantita.getText().toString());
            if (!matcher.matches()){
                quantita.setText("");
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 2017-08-30
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 2016-07-20
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多