输入过滤器 - 两个小数的正则表达式

时间:2016-04-14 17:03:43

标签: java android regex android-edittext

我正在尝试为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;
    }

}

正则表达式思维过程 -

  • 至少一个数字字符
  • 一个点后跟两个数字字符(可选)

当我尝试应用此功能时,它不允许我输入任何数字。我错过了什么?

5 个答案:

答案 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        区域。