【问题标题】:Android edittext - do not allow decimal separator aloneAndroid edittext - 不允许单独使用小数分隔符
【发布时间】:2019-04-23 10:07:52
【问题描述】:

我有一个 Edittext,我希望只允许数字和小数(分隔符后最多 2 个小数,例如 125.50)。

我为此实现了一个过滤器:

 final EditText  field1 = (EditText)findViewById(R.id.field1);
 field1.setFilters(new InputFilter[] { filter });

    InputFilter filter = new InputFilter() {
        final int maxDigitsBeforeDecimalPoint=5;
        final int maxDigitsAfterDecimalPoint=2;

        @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,"+(maxDigitsBeforeDecimalPoint-1)+"})?)?(\\.[0-9]{0,"+maxDigitsAfterDecimalPoint+"})?"

            )) {
                if(source.length()==0)
                    return dest.subSequence(dstart, dend);
                return "";
            }

            return null;

        }
    };

这工作正常,但问题是,如果用户单独插入小数点分隔符,我会得到 java.lang.NumberFormatException: For input string: "."

在我的 ontextChanged 中,我尝试了这个:

 if(field1.getText().toString().equals("[.]")){field1.setText(0);}

还有这个

if(field1.getText().toString().equals(".")){field1.setText(0);}

但没用。

如何单独限制小数分隔符,但允许使用数字?

【问题讨论】:

  • 试试这个^[1-9]\d*(\.\d+)?$ 正则表达式它允许带有可选小数点后跟数字的数字。 1-9 范围内的数字后跟零个或多个其他数字,然后可选地后跟一个小数点,后跟至少 1 个数字:

标签: java android android-edittext decimal


【解决方案1】:

如果这样:

if(field1.getText().toString().equals(".")){field1.setText(0);}

是您的确切代码,那么它肯定会失败,因为 0 不是字符串,它是一个被认为是资源 ID 的整数。
所以先试试这个:

if(field1.getText().toString().equals(".")){field1.setText("0");}

如果再次失败,则考虑NumberFormatException 可以由try/catch 解决,如下所示:

double value = 0.0;
try {
    value = Double.parseDouble(field1.getText().toString());
} catch (NumberFormatException e) {
    field1.setText("0");
    e.printStackTrace();
}

【讨论】:

  • 完美,.setText("0") 修复了它。谢谢!
【解决方案2】:

对于参考,如果您想使用 InputFilter,可以使用此链接:https://stackoverflow.com/a/5368816/10396176

对于其他参考,如果你想使用想要尝试使用 textWatcher: https://stackoverflow.com/a/16684661/10396176

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 2011-11-24
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多