EditText 如何限制输入小数点的位数

105 阅读1分钟
import android.text.Spanned;
import android.text.TextUtils;
 
public class DecimalDigitsInputFilter implements InputFilter {
    private final int mMaxIntegerDigits;
    private final int mMaxFractionDigits;
 
    public DecimalDigitsInputFilter(int maxIntegerDigits, int maxFractionDigits) {
        super();
        this.mMaxIntegerDigits = maxIntegerDigits;
        this.mMaxFractionDigits = maxFractionDigits;
    }
 
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        // 先处理删除的情况
        if (TextUtils.isEmpty(source)) {
            return null;
        }
 
        String newVal = dest.toString().substring(0, dstart) + source + dest.toString().substring(dend);
        boolean isPointEntered = newVal.contains(".");
        int indexOfPoint;
        int integerDigits;
        int fractionDigits;
 
        if (isPointEntered) {
            indexOfPoint = newVal.indexOf(".");
            integerDigits = indexOfPoint;
            fractionDigits = newVal.length() - 1 - indexOfPoint;
            if (fractionDigits > mMaxFractionDigits) {
                return newVal.substring(0, indexOfPoint + mMaxFractionDigits + 1);
            } else {
                return null; // 如果是小数点之后的输入,允许输入,但要检查长度是否超标
            }
        } else {
            integerDigits = newVal.length();
            if (integerDigits > mMaxIntegerDigits) { // 没有小数点时,检查整数部分的长度是否超标
                return dest.subSequence(0, mMaxIntegerDigits); // 超出则截断到最大整数位长度
            } else {
                return null; // 允许输入,但要检查小数点后的位数是否超标
            }
        }
    }
}

一般会限制一下EditText的输入类型


android:id="@+id/editText"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="numberDecimal" /> <!-- 只允许数字和小数点 -->

***************使用的时候如下************************
EditText editText = findViewById(R.id.editText);
InputFilter filter = new DecimalDigitsInputFilter(5, 2); // 允许最多5位整数和2位小数
editText.setFilters(new InputFilter[]{filter});