EditText中只允许有一个小数点



我正在尝试将InputFilter添加到我的EditText中,它必须只允许整数或只有一个小数点的十进制数字。

接受的输入必须是:

1 - 12 - 3.33 - 4.20 etc.

拒绝:

.0 - 5. - 5.5.5 - 40.21.1 etc.  

我创建了一个自定义的InputFilter,它检查RegExp^d+(.d+)?$之后的输入是否匹配

但是EditText总是显示一个空字符串;"跨度";始终为空,而默认情况下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()});

您需要针对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;
}
}

我不得不在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("");
}
}
});

最新更新