EditText限制输入小数点后字符位数

直接上代码

import android.content.Context;
import android.content.res.TypedArray;
import android.text.InputFilter;
import android.text.Spanned;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;

/**
 * @Description 限制输入数字并且只能保留两位小数
 * @Date 2017年11月22日
 */
public class LimitDecimalEditText extends EditText {

    /**
     * 小数点后默认位数
     */
    private static final int DEFAULT_DECIMAL_PLACES = 2;
    /**
     * 小数点前默认位数
     */
    private static final int DEFAULT_NUMBER_PLACES = 6;
    /**
     * 保留小数点后位数
     */
    private int mDecimalPlaces = DEFAULT_DECIMAL_PLACES;
    /**
     * 保留小数点前位数
     */
    private int mNumberPlaces = DEFAULT_NUMBER_PLACES;

    /**
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public LimitDecimalEditText(Context context) {
        this(context, null, android.R.attr.editTextStyle);
        // TODO Auto-generated constructor stub
    }

    /**
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public LimitDecimalEditText(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.editTextStyle);
        // TODO Auto-generated constructor stub
    }

    /**
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public LimitDecimalEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.DecimalEdit);
        mDecimalPlaces = typeArray.getInt(R.styleable.DecimalEdit_decimal_places, DEFAULT_DECIMAL_PLACES);
        mNumberPlaces = typeArray.getInt(R.styleable.DecimalEdit_decimal_places, DEFAULT_NUMBER_PLACES);
        typeArray.recycle();
        setInputType(EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_FLAG_DECIMAL);
        setEditFilter();
    }

    private void setEditFilter() {

        setFilters(new InputFilter[] { new InputFilter() {

            // 参数source:将要插入的字符串,来自键盘输入、粘贴
            // 参数start:source的起始位置,为0(暂时没有发现其它值的情况)
            // 参数end:source的长度
            // 参数dest:EditText中已经存在的字符串
            // 参数dstart:插入点的位置
            // 参数dend:插入点的结束位置,一般情况下等于dstart;如果选中一段字符串(这段字符串将会被替换),dstart的值就插入点的结束位置
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

                System.out.println("LimitDecimalEditText :source=" + source + " start=" + start + " end=" + end + "dest=" + dest + " dstart=" + dstart + " dend=" + dend);

                String lastText = dest.toString();

                if (source.equals(".") && lastText.length() == 0) {
                    return "0.";
                }

                if (source.equals(".") && lastText.length() == mNumberPlaces) {
                    return null;
                }

                if (lastText.contains(".")) {
                    int index = lastText.indexOf(".");
                    String[] str = lastText.split("\\.");
                    if (str.length > 0) {
                        if (str[0].length() >= mNumberPlaces && dstart <= index) {
                            return "";
                        }
                    }
                    if (str.length > 1) {

                        if (str[1].length() >= mDecimalPlaces && dstart > index) {
                            return "";
                        }
                    }

                } else {
                    if (lastText.length() >= mNumberPlaces) {
                        return "";
                    }
                }

                return null;
            }
        } });

    }

    public int getmDecimalPlaces() {
        return mDecimalPlaces;
    }

    public void setmDecimalPlaces(int mDecimalPlaces) {
        this.mDecimalPlaces = mDecimalPlaces;
    }

    public int getmNumberPlaces() {
        return mNumberPlaces;
    }

    public void setmNumberPlaces(int mNumberPlaces) {
        this.mNumberPlaces = mNumberPlaces;
    }

}

attr文件

    <declare-styleable name="DecimalEdit">
        <attr name="decimal_places" format="integer" />
        <attr name="number_places" format="integer" />
    declare-styleable>

decimal_places是小数点后位数的设置
number_places是小数点前位数的设置

"http://schemas.android.com/apk/res/com.example.application"
                            android:id="@+id/weight_unit_edit"
                            android:layout_width="wrap_content"
                            android:layout_height="match_parent"
                            android:layout_marginRight="@dimen/px20"
                            android:background="@color/white"
                            android:gravity="center_vertical|right"
                            android:hint="请输入"
                            android:inputType="numberDecimal"
                            android:paddingLeft="@dimen/px5"
                            android:paddingRight="@dimen/px5"
                            android:textColor="@color/typeface_five"
                            android:textColorHint="@color/c_cccccc"
                            android:textSize="@dimen/size29"
                            edit:decimal_places="4"
                            edit:number_places="9" />

然后直接在xml文件引用就可以,或者也可以动态设置,记得加命名空间,否则设置的值没有用
http://schemas.android.com/apk/res/是固定的格式,com.example.application是包名

你可能感兴趣的:(Android,EditText小数,EditText限制)