输入金额专用EditText

  1. @SuppressLint("AppCompatCustomView")
    public class AmountEditText extends EditText {
    
        private Context mContext;
    
        public AmountEditText(Context context) {
            super(context);
            init(context);
        }
    
        public AmountEditText(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public AmountEditText(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context);
        }
    
        private void init(Context context){
            mContext = context;
        }
    
        @Override
        public void setFilters(InputFilter[] filters) {
            filters = new InputFilter[]{new AmountFilter()};
            super.setFilters(filters);
        }
    }
public class AmountFilter implements InputFilter {

    private final String TAG = "AmountFilter";

    Pattern mPattern;//正则匹配

    private static final int POINTER_AFTER_LENGTH = 2; //小数点后的位数

    private static final String POINTER = ".";

    private static final String ZERO = "0";


    public AmountFilter() {
        //正则表达式
        mPattern = Pattern.compile("([0-9]|\\.)*");
    }


    /**
     * @param source    新输入的字符串
     * @param start     新输入的字符串起始下标,一般为0
     * @param end       新输入的字符串终点下标,一般为source长度-1
     * @param dest      输入之前文本框内容
     * @param dstart    原内容起始坐标,一般为0
     * @param dend      原内容终点坐标,一般为dest长度-1
     * @return          输入内容
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {

        String sourceText = source.toString();
        String destText = dest.toString();

        //验证删除等按键
        if (TextUtils.isEmpty(sourceText)) {
            return  "";
        }

        //如果是0开头,则下一位必须是点
        if (destText.startsWith(ZERO)){
            if (!TextUtils.equals(POINTER,source) && destText.length() == 1){
                sourceText = "";
            }
            //0和点之间不能输入任何数字
            else if (destText.contains(POINTER)){
                int point = destText.indexOf(POINTER);
                if (dstart <= point && dstart > 0){
                    sourceText = "";
                }
            }
            else if (!destText.contains(POINTER)
                    && dstart != 0 && destText.length() != 1){
                sourceText = "";
            }

        }

        //不能将0放在字符串的第一位
        if (!TextUtils.isEmpty(destText) && dstart == 0
                && TextUtils.equals(ZERO,sourceText)
                && !destText.startsWith(POINTER)){
            sourceText = "";
        }

        //第一位不能输入“.”
        if (TextUtils.isEmpty(destText) && TextUtils.equals(sourceText,POINTER)){
            sourceText = "";
        }

        //如果第一位为“.”,则点号后面不能继续输入
        if (destText.startsWith(POINTER) && dstart != 0){
            sourceText = "";
        }

        //保留POINTER_AFTER_LENGTH位小数
        if (!destText.contains(POINTER) && TextUtils.equals(POINTER,sourceText)){
            int decimal = destText.length() - dstart;
            if (decimal > 2){
                sourceText = "";
            }
        }else if (destText.contains(POINTER)){
            int point = destText.indexOf(POINTER);
            if (dstart > point && (destText.length() - point) >= 3){
                sourceText = "";
            }
        }

        String result = dest.subSequence(dstart, dend) + sourceText;
        return result;
    }}

应用示例:

<com.example.jiajiale.view.AmountEditText
            android:id="@+id/money_maxprice"
            android:layout_width="92dp"
            android:layout_height="30dp"
            android:hint="请输入最高值"
            android:textColor="#666666"
            android:textSize="12sp"
            android:gravity="center"
            android:layout_marginLeft="10dp"
            android:background="@drawable/login_botton_norbg"
            android:inputType="numberDecimal"
            android:imeOptions="actionDone"
            />

最后最好再验证一次输入是否正确

/**
     * 输入内容是否符合规则
     * @return
     */
    public static boolean isConformRules(String result){
        if (TextUtils.isEmpty(result)){
            return false;
        }else if (result.contains(".")){
            if (result.startsWith(".")){
                return false;
            }else if (result.startsWith("0")){
                int indexZero = result.indexOf("0");
                int indexPoint = result.indexOf(".");
                if (indexPoint - indexZero != 1){
                    return false;
                }else if (TextUtils.equals("0.",result)){
                    return false;
                }
            }
        }else if (!result.contains(".")){
            if (result.startsWith("0")){
                return false;
            }
        }
        return true;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值