代码之家  ›  专栏  ›  技术社区  ›  Darksymphony

Android EditText-不允许单独使用十进制分隔符

  •  1
  • Darksymphony  · 技术社区  · 7 年前

    我有一个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:用于输入字符串:“”。

    在我的 文本更改 我试过这个:

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

    也这个

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

    但没用。

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   forpas    7 年前

    如果这是:

    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();
    }
    
        2
  •  1
  •   JEFF    7 年前

    对于引用,如果要使用inputfilter,可以使用此链接: https://stackoverflow.com/a/5368816/10396176

    对于其他引用,如果要使用“希望尝试使用TextWatcher: https://stackoverflow.com/a/16684661/10396176