我在我的Android应用程序中有一个TextedIt字段。我需要与此字段匹配的模式为0-8位,然后是一个可选的时期和一个小数点。因此,8个数字 一个总共9个字符的小数点。仅在遵循该期间的情况下才能使用第9位。
应该通过的示例测试用例: 1
12345678
12345678.9
12.3
.5
我的代码如下,
在我的Edittext
mFrequency = (EditText) v.findViewById(R.id.myField)
mFrequency.addTextChangedListener(mFrequencyEditTextListener);
InputFilter[] frequencyViewInputFilters = { new DecimalDigitsInputFilter()};
mFrequency.addTextChangedListener(mFrequencyEditTextListener);
在我的Decimaldigitsinputfilter类中
public DecimalDigitsInputFilter()
{
mPattern=Pattern.compile("\d{0,8}(\.|(\\.\d))?");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher matcher=mPattern.matcher(dest);
if(!matcher.matches())
return "";
return null;
}
它通过了我的所有测试用例,但未能通过以下方式: 123456789
它允许用户输入9位数字,而没有最后一个数字之前的时间。
我以前的正则是\d{0,8}(\.|(\.\d))?
它允许用户输入123456789
以及12345678.99
任何帮助将不胜感激。
此正则应该有效:
d{0,8}(?:.d)?
解释
d{0,8}
匹配0至8位数字。
(?:.d)
匹配一个时期,然后是数字。
?
使上一位可选。