我正在尝试为EditText
创建一个正则表达式,只允许以美元格式输入。但它没有用。
public class DecimalInputFilter implements InputFilter {
Pattern mPattern;
public DecimalInputFilter() {
mPattern=Pattern.compile("^[0-9]+([.][0-9]{2})?$");
}
@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;
}
}
正则表达式思维过程 -
当我尝试应用此功能时,它不允许我输入任何数字。我错过了什么?
答案 0 :(得分:4)
使用下一个过滤功能:
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source.equals("")) return null; // Para el backspace
StringBuilder builder = new StringBuilder(dest);
builder.replace(dstart, dend, source.subSequence(start, end).toString());
Matcher matcher=mPattern.matcher(builder);
if(!matcher.matches())
return "";
return null;
}
因为如果你在构建器上匹配,它会告诉你最后的字符串是否与建议的表达式匹配,否则返回空字符串。
答案 1 :(得分:3)
您可以试用以下过滤器,使用MAX_NUMBER
设置点前的最大位数,PRECISION
设置点后的精度数。
public class DecimalInputFilter implements InputFilter {
private static final int MAX_NUMBER = 10;
private static final int PRECISION = 2;
public DecimalInputFilter() {
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
StringBuilder builder = new StringBuilder(dest);
builder.replace(dstart, dend, source.subSequence(start, end).toString());
if (!builder.toString().matches("(([0-9]{1})([0-9]{0,"+(MAX_NUMBER-1)+"})?)?(\\.[0-9]{0,"+PRECISION+"})?")) {
if(source.length() == 0)
return dest.subSequence(dstart, dend);
return "";
}
return null;
}
}
答案 2 :(得分:3)
无论你在editText中输入什么内容,你都会在源代码中收到CharSequence,并在dest中收到你已经输入的字符串,所以请尝试
Matcher matcher=mPattern.matcher(dest.toString() + source.toString());
并将正则表达式用作^[0-9]+([.][0-9]{0,2})?$
上面的正则表达式也将除了4.但是没有什么可以做,因为我们一次只能输入一个字符,所以要注意你可以在提交值后进行最后的正则表达式检查。
答案 3 :(得分:0)
写作时
Matcher matcher=mPattern.matcher(dest);
if(!matcher.matches())
return "";
这意味着如果您的编辑文本与正则表达式不匹配,则所有输入都将替换为""
,我认为这是最初的情况,因为它可能是一个空字符串。
答案 4 :(得分:-2)
我猜你正在体验这一点,因为你的过滤器处理每个输入符号的输入,直到你输入你的正则表达式与输入不匹配的所有符号。当你尝试输入第一个符号时,假设它是“2”,它与整个正则表达式不匹配。所以你要么必须改变你的正则表达式并使它的点和小数部分可选,要么你必须在输入完成时以更明确的方式应用滤波器(比如“发送/应用”按钮点击动作)。
作为旁注,请考虑为android:inputType
元素使用EditText
属性,在10个案例中的9个案例中,它涵盖了过滤输入的所有需求;在你的情况下,我建议你使用“numberDecimal”类型。
编辑:请注意,即使您的正则表达式将输入的小数部分标记为可选,Matcher.matches()
方法只有在匹配整个正则表达式时才返回true
。
来自Matcher类JavaDoc:
尝试将模式与整个区域(或 整个输入,如果没有设置区域)。 如果(且仅当)Pattern匹配整个时,则返回true 区域。