And*_*Dev 22 regex android android-edittext
我有一个numberDecimal EditText,我想用正则表达式验证.在验证中我想要的是:
在小数点之前,我要输入的最大数字是3,数字不应该像零一样从零开始2,23,342,等等.
小数点后,我想进入的最大数字是一个像.1,.3,.6等等.
所以,我允许用户输入的数字一样2.1,32.5,444.8,564.9,等.
但在我的代码中,会发生什么:
它允许用户在小数点前输入超过三位数更像是3456,4444,5555之后,它不会让我以后输入小数点.
它允许我0在小数点之前输入数字的开头.
那么为什么会发生这种情况,我使用的正则表达式有什么不对吗?如果有人知道,请帮我解决这个问题.
我用过的代码:
weightEditText.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s)
{
Pattern mPattern = Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$");
Matcher matcher = mPattern.matcher(s.toString());
if(!matcher.find())
{
weightEditText.setText(); // Don't know what to place
}
}
});
Run Code Online (Sandbox Code Playgroud)
Ted*_*opp 24
dest在一个人中单独检查从来没有任何意义InputFilter; 这就是现场已经存在的东西.将正则表达式匹配更改为反对source,如果您只想检查字段中是否接受了某些字符,那么它是合适的.但是,您要检查字段格式,而不仅仅是逐个字符地过滤输入.这要复杂得多.
每次用户更改内容时tempEditText,系统会在实际进行更改之前调用过滤器的filter方法.它传递当前字段内容和建议的更改(可以插入/追加,删除或替换).更改由源(字符 - 如果有任何 - 要添加到字段),源中的范围开始和结束索引(范围不一定全部),a (更改前的当前字段内容)表示建议将范围内的dstart和dend索引替换为指定的范围.CharSequence sourcesourceSpanned destdestsource
工作filter是修改变更(如有必要)并返回CharSequence使用(完整)代替source(或null继续使用source).dest您需要检查更改是否会产生可接受的字段,而不是像现在一样进行检查.要做到这一点,您将需要更复杂的逻辑.(特别注意,新字符可能用于插入除最后之外的某处;也filter可以在用户删除字符以及添加字符时调用.)
实现一个可能更容易TextWatcher.在它的beforeTextChanged方法中,您可以记录当前内容,并且在其afterTextChanged方法中,您可以检查(使用正则表达式)内容是否可接受,如果不是,则恢复更改前的内容.(但请确保更改前的文本是可以接受的.如果不是,请替换可接受的内容 - 比如清除字段.否则您的代码将进入无限循环,因为TextWatcher当您更正时将再次调用现场内容.)
您的正则表达式中也有错误:它允许前导零.这是一个修复此问题的改进版本(并删除了一组不必要的括号):
"^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"
Run Code Online (Sandbox Code Playgroud)
(顺便说一句:你可以用\\d而不是[0-9].)
编辑
这是我对您的编辑的编辑:
weightEditText.addTextChangedListener(new TextWatcher()
{
private static final Pattern sPattern
= Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$");
private CharSequence mText;
private boolean isValid(CharSequence s) {
return sPattern.matcher(s).matches();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count){
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after){
mText = isValid(s) ? new CharSequence(s) : "";
}
@Override
public void afterTextChanged(Editable s)
{
if (!isValid(s))
{
weightEditText.setText(mText);
}
mText = null;
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67362 次 |
| 最近记录: |