天天看點

金額輸入框過濾器

實時監聽輸入框資料,如果不滿足條件,原資料不發生變化,新的操作無效。依賴 LogUtil

<pre>

package github.alex.decimaledittext.core;

import github.alex.util.LogUtil;

import android.annotation.TargetApi;

import android.os.Build;

import android.text.InputFilter;

import android.text.Spanned;

import android.text.TextUtils;

import android.widget.EditText;

/**理财類輸入框格過濾器

* 屏蔽複制粘貼、剪切功能

* 限制 小數點以後的 位數為 floatLength

* 限制最大輸入金額為 maxValue

* 不讓輸入0.00

* 當輸入 【0】 的時候, 自動生成 【0.】

* 當輸入【.】的時候,自動生成【0.】

* 當原字元為【0.0】的時候,不讓輸入【0】

* 當原字元為【0.0*】的時候(*非零),【.】不讓删除

* 當原字元為【*.00】的時候(*為非零整數),【*】不讓删除

* 當原字元為【*0.00】的時候,【*】不讓删除

* 當原字元為【*****.**】的時候,如果删除【.】造成新資料大于最大值,【.】不讓删除

* 當原字元為【*****.**】的時候,在整數部分鍵入新資料【#】,造成新資料大于最大值,【#】不讓鍵入

* 當原字元為【********】的時候,在整數部分鍵入新資料【.】,造成小數點個數大于 floatLength ,【.】不讓鍵入

* */

@TargetApi(Build.VERSION_CODES.HONEYCOMB)

public class SimpleDecimalInputFilter implements InputFilter

{

private EditText editText;

private double maxValue;

private int floatLength;

/**屏蔽粘貼功能*/

private boolean isNoPaste;

/**解決 剪切 和 粘貼 的 沖突*/

private boolean isAlexPaste;

/\*\*@param editText  輸入框
 \* @param floatLength
 \* @param 最大輸入金額 maxValue
 \* @param 整數部分最多個數 intLength
 \* @param 小數部分最多個數 floatLength \*/
public SimpleDecimalInputFilter(EditText editText, double maxValue, int floatLength) {
    this.editText  = editText;
    this.maxValue = maxValue;
    this.floatLength = floatLength;
    editText.setLongClickable(false);
    editText.setTextIsSelectable(false); 
    isNoPaste = true;
    isAlexPaste = false;
}
/\*\*
 \* @param source 目前鍵入、鍵出 的 字元
 \* @param dest 所有的字元(除目前鍵入之外)
 \* @param start 新輸入的字元串起始下标
 \* @param end  新輸入的字元串終點下标
 \* @param dstart 原内容發生改變,改變的起點坐标
 \* @param dend 原内容發生改變,改變的終點坐标
 \* end > start 表示鍵入資料;end = 0 = start 表示鍵出資料
 \* @return 目前鍵入 鍵出的字元
 \* \*/
@Override  
public CharSequence filter(CharSequence source, int start, int end,   Spanned dest, int dstart, int dend) {   
    /\*光标位置\*/
    int selectionStart = editText.getSelectionStart();
    if((dstart < dend) && (TextUtils.isEmpty(source))){

    } 
    if(dest == null){
        return "";
    }
    if( TextUtils.isEmpty(source) && (dend-dstart > 1)){
        /\*屏蔽剪切\*/
        isAlexPaste = true;
        editText.setText(dest);
        editText.setSelection(dest.length());
        return "";
    }
    if((!TextUtils.isEmpty(source)) && (end-start > 1)  && isNoPaste){
        if(isAlexPaste){
            isAlexPaste = false;
            return editText.getText();
        }
        /\*屏蔽粘貼\*/
        return "";
    } 
    String destValue = dest.toString();  
    /\*輸入框真實資料,原有資料 和 鍵入 鍵出 進行邏輯運算之後的 真實資料\*/
    String trueFullText = "";
    /\*目前 鍵入一個字元 , subIndexStart 是鍵入的字元為止 之前的 所有字元\*/
    String subIndexStart = "";
    /\*目前 鍵入一個字元 , subIndexStart 是鍵入的字元為止 之後的 所有字元\*/
    String subIndexEnd = "";
    if(!TextUtils.isEmpty(dest)){
        /\*插入一個字元\*/
        subIndexStart = destValue.substring(0, dstart); 
        if(end > start){
            /\*鍵入資料\*/
            if(dend == 0){
                subIndexEnd = destValue.substring(0, dest.length());
            }else{
                subIndexEnd = destValue.substring(dend, dest.length());
            }
        }else{
            /\*鍵出資料\*/
            if(dend == 0){
                subIndexEnd = destValue.substring(0, dest.length());
            }else{
                subIndexEnd = destValue.substring(dend, dest.length());
            }
        }
    }
    LogUtil.e("到這了");
    trueFullText = subIndexStart+source+subIndexEnd;
    LogUtil.e("全内容 = "+trueFullText+" source = "+source+" dest = "+dest+" start = "+start+" end = "+end+" dstart = "+dstart+" dend = "+dend+" 光标下标 = "+selectionStart);

    String[] trueFullTextArray = trueFullText.split("\\.");  
    LogUtil.e("到這了");
    if (dest.length() == 0 && source.equals(".")) {  
        /\*如果 一開始 就輸入 . 自動補全成 0. \*/
        LogUtil.e("到這了");
        return "0.";  
    } 
    if("0".equals(source) && (dest.length() ==0)){
        /\*如果 一開始 就輸入 0 自動補全成 0. \*/
        LogUtil.e("到這了");
        return "0.";
    }

    LogUtil.e("到這了");
    if((selectionStart == 0) && (!TextUtils.isEmpty(destValue))&& ('.'  != destValue.charAt(1))){
        if("0".equals(source) || ".".equals(source)){
            LogUtil.e("到這了");
            /\*如果原字元串不是空, 二個字元不是. 不讓輸入 0\*/
            return "";
        }

    }
    LogUtil.e("到這了");
    if((!TextUtils.isEmpty(destValue)) && (destValue.length() >1)){
        LogUtil.e("destValue = "+destValue);
        if(destValue.length() > 2){
            LogUtil.e("destValue = "+destValue+" "+destValue.charAt(0)+" "+destValue.charAt(1)+" "+destValue.charAt(2));
        }
        LogUtil.e("到這了");
        if(('0'==destValue.charAt(0)) && (destValue.length()>2) && ('.'==destValue.charAt(1)) &&('0'==destValue.charAt(2)) && "0".equals(source)){
            /\*原文本是 0.0  不讓在輸入0\*/
            LogUtil.e("到這了");
            return "";
        }
        LogUtil.e("到這了");
        if((trueFullTextArray.length >1) && (trueFullTextArray[1].length() > floatLength)){
            LogUtil.e("到這了");
            return "";
        }
        LogUtil.e("到這了");
        /\*原文本有 2 個以上 字元\*/
        if(('.'==destValue.charAt(1)) && (selectionStart==0) && TextUtils.isEmpty(source)){
            LogUtil.e("到這了");
            /\*如果 往前删除,剩下的 第一個字元 是 .   自動補全 0. \*/
            return destValue.charAt(0)+"";
        }
        LogUtil.e("到這了");
        if((destValue.length()>3) && ('.'==destValue.charAt(2)) && ('0'==destValue.charAt(1)) && ('0'==destValue.charAt(3))){
            LogUtil.e("到這了");
            /\*【\*0.00】時, \*不讓删除 \*/
            return "";
        }
        LogUtil.e("到這了");
        if((destValue.length() >1)  && ('0'==destValue.charAt(1))  && (selectionStart==1)){
            /\*第二個字元 是 0  第一個 不讓删除\*/
            LogUtil.e("到這了");
            if((destValue.length() >2 ) && ('.'==destValue.charAt(2))  && TextUtils.isEmpty(source)){
                LogUtil.e("到這了");
                /\*第二個字元 是 0  ,第三個是 .   ,第一個 不讓删除\*/
                return destValue.charAt(0)+"";
            }
            LogUtil.e("到這了"); 
            return destValue.charAt(0)+"";
        }
    }
    if((destValue.length()>2) &&('0'==destValue.charAt(0)) && ('.'==destValue.charAt(1)) && ('0'==destValue.charAt(2)) && (TextUtils.isEmpty(source))){
        LogUtil.e("到這了");
        return ".";
    }
    LogUtil.e("到這了");
    if((destValue.length() > 1) && ('.'==destValue.charAt(1)) && (selectionStart==1)){
        LogUtil.e("到這了");
        /\*  【\*.0\*】的情況下,第一個\* 不讓删除  \*/
        if((destValue.length()>3) && ('.'==destValue.charAt(1)) && ('0'==destValue.charAt(2)) && ('0'==destValue.charAt(3)) && (TextUtils.isEmpty(source)) ){
            return destValue.charAt(0)+"";
        }
    }
    LogUtil.e("到這了");
    double trueFullTextDoubleValue = string2Double(trueFullText);

    if(trueFullText.contains(".")){
        LogUtil.e("到這了");
        /\*目前  輸入框 包含小數點\*/
        if(trueFullTextArray.length > 1){
            LogUtil.e("到這了");
            if(       (trueFullTextArray[1].length() > floatLength)      ||         ( trueFullTextDoubleValue  >= maxValue )            ){
                LogUtil.e("到這了");
                return "";
            }
        }

    }else{
        LogUtil.e("到這了");
        /\*目前 輸入框 不包含 小數點\*/
        if(   (trueFullTextDoubleValue  >= maxValue )     &&     ( !".".equals(source) ) ){
            if(destValue.contains(".")){
                return ".";
            }
            return "";
        }
    }

    return source;  
}

private double string2Double(String text){
    try
    {
        return Double.parseDouble(text);
    } catch (Exception e){
        return 0D;
    }

}
           

}

</pre>

繼續閱讀