實時監聽輸入框資料,如果不滿足條件,原資料不發生變化,新的操作無效。依賴 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>