EditText控制输入小数位数和整数位数

252 阅读1分钟
//小数点前边几位(修改这里可以自定义)
int beforeDecimalNum = 8;
//小数点后边几位(修改这里可以自定义)
int afterDecimalNum = 2;
//最大长度是多少位(修改这里可以自定义)
int maxLength = 11;
//输入的类型可以是整数或小数
etElectricityMeter.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
DecimalInputFilter decimalInputFilter = new DecimalInputFilter(beforeDecimalNum, afterDecimalNum);
//输入总长度多少位,小数几位(修改这里可以自定义)
InputFilter[] inputFilter = {new InputFilter.LengthFilter(maxLength), decimalInputFilter};
etElectricityMeter.setFilters(inputFilter);
etElectricityMeter.addTextChangedListener(new DecimalTextWatcher(etElectricityMeter, afterDecimalNum));

import android.text.InputFilter;
import android.text.Spanned;

public class DecimalInputFilter implements InputFilter {
  private static final String TAG = DecimalInputFilter.class.getSimpleName();
  //小数点前边几位
  private int beforeDecimalNum;
  //小数点后边几位
  private int afterDecimalNum;

  public DecimalInputFilter(int beforeDecimalNum, int afterDecimalNum) {
    this.beforeDecimalNum = beforeDecimalNum;
    this.afterDecimalNum = afterDecimalNum;
  }

  @Override
  public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String beforeData = dest.toString();
    String inputData = source.toString();
    if (source.length() == 0 && dend > dstart) {
      //删除操作

      //使用系统的
      return null;
    } else {
      //输入操作
      if (beforeData.contains(".")) {
        String[] beforeDataArr = beforeData.split("\.");
        if (beforeDataArr.length > 1 && beforeDataArr[0].length() >= beforeDecimalNum && beforeDataArr[1].length() >= afterDecimalNum) {
          //返回自定义的
          return "";
        } else if (beforeDataArr.length >= 1 && beforeDataArr[0].length() >= beforeDecimalNum && dstart <= beforeDecimalNum) {
          //返回自定义的
          return "";
        } else if (beforeDataArr.length > 1 && beforeDataArr[1].length() >= afterDecimalNum && dend >= beforeDecimalNum) {
          //返回自定义的
          return "";
        }
      } else {
        if (beforeData.length() >= beforeDecimalNum && !inputData.equals(".")) {
          //返回自定义的
          return "";
        }
      }
    }
    //使用系统的
    return null;
  }

}

import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.widget.EditText;

public class DecimalTextWatcher implements TextWatcher {

  private static final String TAG = DecimalTextWatcher.class.getSimpleName();
  private String beforeData;
  private String[] beforeDataArr;
  private EditText editText;
  //小数点后边几位
  private int afterDecimalNum;
  //    private OnCommonSingleParamCallback<String> onCommonSingleParamCallback;
  private int index;

  public DecimalTextWatcher(EditText editText, int afterDecimalNum) {
    this.editText = editText;
    this.afterDecimalNum = afterDecimalNum;
  }

//    public DecimalTextWatcher(EditText editText, int afterDecimalNum, OnCommonSingleParamCallback<String> onCommonSingleParamCallback) {
//        this.editText = editText;
//        this.afterDecimalNum = afterDecimalNum;
//        this.onCommonSingleParamCallback = onCommonSingleParamCallback;
//    }

  @Override
  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    beforeData = s.toString();
    beforeDataArr = null;
    if (!TextUtils.isEmpty(beforeData) && beforeData.contains(".")) {
      beforeDataArr = beforeData.split("\.");
    }
    index = editText.getSelectionStart();
  }

  @Override
  public void onTextChanged(CharSequence s, int start, int before, int count) {

  }

  @Override
  public void afterTextChanged(Editable s) {
    String afterData = s.toString();
    editText.removeTextChangedListener(this);
    if (afterData.contains(".") && afterData.length() > 1) {
      if (beforeDataArr != null && beforeDataArr.length > 1) {
        for (int i = 0; i < beforeDataArr.length; i++) {
          if (afterData.contains(beforeDataArr[i])) {
            String[] afterDataArr = afterData.split("\.");
            if (afterDataArr != null && afterDataArr.length > 1 && afterDataArr[1].length() > afterDecimalNum) {
              if (index >= afterDataArr[0].length()) {
                s.delete(index, index + 1);
              }
              break;
            }
          }
        }
      }
    }
    editText.addTextChangedListener(this);

//        afterData = s.toString();
//        if (!TextUtils.isEmpty(afterData)) {
//            onCommonSingleParamCallback.onSuccess(afterData);
//        } else {
//            onCommonSingleParamCallback.onError("");
//        }
  }

}