我有一个numberDecimal EditText
,我想使用正则表达式来验证它。在验证中,我想要的是:
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
}
}
});
发布于 2012-04-27 06:39:27
在InputFilter
中单独检查dest
永远没有任何意义;这是该领域已经存在的内容。将正则表达式匹配更改为与source
匹配,如果您只想检查字段是否接受某些字符,这将是合适的。但是,您需要检查字段格式,而不仅仅是逐个字符地过滤输入。这要复杂得多。
每次用户更改tempEditText
的内容时,系统都会在实际更改之前调用过滤器的filter
方法。它传递当前字段内容和建议的更改(可以是插入/追加、删除或替换)。变化由源CharSequence source
(要添加到字段中的字符-如果有的话)、源中的范围开始和结束索引(范围不一定是source
的全部)、Spanned dest
(改变前的当前字段内容)以及dest
中的范围dstart和dend索引表示,建议由所指示的source
范围替换。
filter
的工作是修改更改(如有必要),并返回一个CharSequence
以(完整地)代替source
使用(或返回null
以继续使用source
)。您需要检查更改是否会产生可接受的字段,而不是像现在这样检查dest
。要做到这一点,您将需要更复杂的逻辑。(特别要注意,新字符可能是为了在末尾以外的位置插入;而且,当用户删除和添加字符时,将调用filter
。)
实现TextWatcher
可能会更容易。在它的beforeTextChanged
方法中,您可以记录当前内容,在它的afterTextChanged
方法中,您可以检查(使用正则表达式)内容是否可接受,如果不能接受,则恢复更改前的内容。(不过,请确保更改前的文本是可接受的。如果不是,则替换为可接受的内容-例如清除字段。否则,您的代码将进入无限循环,因为当您更正字段内容时,将再次调用TextWatcher
。)
您的正则表达式中也有一个错误:它允许前导零。这里有一个改进的版本来解决这个问题(并删除了一组不必要的括号):
"^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"
(顺便说一句:您可以使用\\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;
}
});
发布于 2014-12-27 03:27:16
也许我的实现对任何人都有帮助:
etRepeaterCallsign.addTextChangedListener(new TextWatcher() {
private final Pattern sPattern
= Pattern.compile("^([A-Z]{0,2})?(\\d)?([A-Z-]{0,5})"); // ^([1-9][0-9]{0,2})?(\\.[0-9]?)?$
private CharSequence mText;
private boolean isValid(CharSequence s) {
return sPattern.matcher(s).matches();
}
@Override
public void beforeTextChanged(CharSequence r, int start, int count,
int after) {
mText = r.toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
bIsEdit = true;
}
@Override
public void afterTextChanged(Editable s) {
etRepeaterCallsign.removeTextChangedListener(this);
int iCursorPosition = etRepeaterCallsign.getSelectionStart();
etRepeaterCallsign.setText("");
if (isValid(s))
etRepeaterCallsign.append(s);
else
etRepeaterCallsign.append(mText);
etRepeaterCallsign.setSelection(iCursorPosition);
etRepeaterCallsign.addTextChangedListener(this);
}
});
发布于 2012-04-26 13:56:39
你可以解析这个数字,然后检查它是否小于1000,以及10*number是否为整数,而num不是。它可能也会更具可读性。
https://stackoverflow.com/questions/10327901
复制相似问题