1. 程式人生 > >Android實現EditText輸入金額

Android實現EditText輸入金額

EditText是Android中一個非常實用的控制元件,有很多InputType,可以來達到不同的輸入效果,如下圖:


比如,密碼輸入,數字輸入等等。但是最近在專案中要實現EditText輸入金額,金額的限制因素很多,比如,只能輸入數字和小數點,首位不能輸入0和小數點,小數點後面只能保留兩位等等,這些僅僅用InputType是無法實現的,今天用InputFilter來實現。

1. 首先需要將EditText的InputType設定成如下格式,保證使用者只能輸入小數點和數字

android:inputType="numberDecimal"或者setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL)

2. 自定義InputFilter,程式碼如下:

CashierInputFilter.java

package com.iscs.mobilewcs.tools;

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

import java.util.regex.Matcher;
import java.util.regex.Pattern;  
  
/** 
 * Created by Jackie on 2017/2/22.
 * 過濾使用者輸入只能為金額格式 
 */  
public class CashierInputFilter implements InputFilter {
    Pattern mPattern;  

    //輸入的最大金額  
    private static final int MAX_VALUE = Integer.MAX_VALUE;  
    //小數點後的位數  
    private static final int POINTER_LENGTH = 2;  
  
    private static final String POINTER = ".";  
  
    private static final String ZERO = "0";

    public CashierInputFilter() {
        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 "";  
        }  
  
        Matcher matcher = mPattern.matcher(source);  
        //已經輸入小數點的情況下,只能輸入數字  
        if(destText.contains(POINTER)) {  
            if (!matcher.matches()) {  
                return "";  
            } else {  
                if (POINTER.equals(source.toString())) {  //只能輸入一個小數點
                    return "";  
                }  
            }  
  
            //驗證小數點精度,保證小數點後只能輸入兩位  
            int index = destText.indexOf(POINTER);  
            int length = dend - index;  
  
            if (length > POINTER_LENGTH) {  
                return dest.subSequence(dstart, dend);
            }  
        } else {
            /**
             * 沒有輸入小數點的情況下,只能輸入小數點和數字
             * 1. 首位不能輸入小數點
             * 2. 如果首位輸入0,則接下來只能輸入小數點了
             */
            if (!matcher.matches()) {  
                return "";  
            } else {  
                if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) {  //首位不能輸入小數點
                    return "";
                } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首位輸入0,接下來只能輸入小數點
                    return "";
                }
            }  
        }  
  
        //驗證輸入金額的大小
        double sumText = Double.parseDouble(destText + sourceText);
        if (sumText > MAX_VALUE) {  
            return dest.subSequence(dstart, dend);  
        }  
  
        return dest.subSequence(dstart, dend) + sourceText;  
    }  
}
使用方法如下: