如何强制用户以指定的格式在EditText中输入值

时间:2018-03-21 07:40:29

标签: android android-edittext

有人可以帮帮我吗?我如何强制用户以XX.XX格式(Eg.56.75)输入numberDecimal字段中的EditText

我使用max length属性将最大长度限制为5。

6 个答案:

答案 0 :(得分:2)

你可以采用最简单的方式

<EditText
   //.....
    android:inputType="numberDecimal" /> // set inputformat

如果您需要确保InputFilter之前和之后有2个数字,则可以使用.

在onCreate

下试试
youreditText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter()});

这只是这个

的一个类

修改 不得不重写模式,因为似乎匹配器匹配从第一个字符开始的输入并检查每个字符,因此您需要在模式中添加许多可选部分,以便它传递正在进行的每个检查。现在它不像你的情况那样允许222

public class DecimalDigitsInputFilter implements InputFilter {

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        if (end > start) {
            String destTxt = dest.toString();
            String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend);
            if (!resultingTxt.matches("^\\d(\\d(\\.\\d{0,2})?)?")) {
                return "";
            }
        }
        return null;
    }
}

答案 1 :(得分:1)

你可以尝试

        TextWatcher t1;
        EditText e;
        t1=new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                if(s.length()==3 && !s.toString().contains("."))
                {
                    e.removeTextChangedListener(t1);
                    e.setText(s.subSequence(0,1)+"."+s.charAt(2));
                    e.addTextChangedListener(t1);
                }
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                // TODO Auto-generated method stub
            }

            @Override
            public void afterTextChanged(Editable s) {

                // TODO Auto-generated method stub
            }
        };
        e.addTextChangedListener(t1);

答案 2 :(得分:0)

试试这个:

edittext.addTextChangedListener(new TextWatcher() {

   @Override
   public void afterTextChanged(Editable s) {}

   @Override    
   public void beforeTextChanged(CharSequence s, int start,
     int count, int after) {
   }

   @Override    
   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
      DecimalFormat formatter = new DecimalFormat("##.##");
      String yourFormattedString = formatter.format(s.toString());
      edittext.setText(yourFormattedString);
   }
  });

答案 3 :(得分:0)

试试这个

exitText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if(charSequence.length() == 2){
                exitText.setText("");
                exitText.setText(charSequence+".");
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });

答案 4 :(得分:0)

如果您想使用十进制数字格式,可以在XML中使用它:

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="numberDecimal" />

要限制位数,您可能需要使用其他答案中提及的InputFilter或此处:Limit Decimal Places in Android EditText

答案 5 :(得分:0)

以下代码也有效:

在OnCreateView中:

myEditText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(2,2)});

Java类:

public class DecimalDigitsInputFilter implements InputFilter {


    final int maxDigitsBeforeDecimalPoint ;
    final int maxDigitsAfterDecimalPoint ;

    public DecimalDigitsInputFilter(int digitsBeforeDecimal,int digitsAfterDecimal ){
        maxDigitsBeforeDecimalPoint = digitsBeforeDecimal;
        maxDigitsAfterDecimalPoint = digitsAfterDecimal;
    }

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

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

        return null;

    }


}