金额输入框过滤器

简介: 实时监听输入框数据,如果不满足条件,原数据不发生变化,新的操作无效。依赖 LogUtilpackage github.alex.decimaledittext.

实时监听输入框数据,如果不满足条件,原数据不发生变化,新的操作无效。依赖 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>

目录
相关文章
|
7月前
|
前端开发
input输入框只能输入数字且保留两位小数场景演练(金额)
input输入框只能输入数字且保留两位小数场景演练(金额)
|
4月前
uniapp确认提示框;uniapp判断输入框值是否符合正常手机号,身份证号
uniapp确认提示框;uniapp判断输入框值是否符合正常手机号,身份证号
144 0
|
9月前
|
Java Maven 数据安全/隐私保护
一个简单的自定义输入框
今天还是一篇关于自定义View相关的,带来一个大众的,常见的一个输入框,很多的场合下都能遇到,比如验证码,密码框等等,配置了很多常见的属性,可以满足不同场合下的需求,矩形框,圆角框,下划线等等均可满足,长度设置,光标选择,背景选择,均可控制。
|
5月前
|
前端开发
Layui表单必填项自动打红色*号
Layui表单必填项自动打红色*号
106 0
|
5月前
日历控件input框默认显示当日日期
日历控件input框默认显示当日日期
43 0
|
6月前
|
存储
65EasyUI 表单 - 过滤下拉数据网格
65EasyUI 表单 - 过滤下拉数据网格
27 0
|
6月前
|
PHP
HTML购物车示例(勾选、删除、添加和结算功能)
HTML购物车示例(勾选、删除、添加和结算功能)
输入售价后点击计算税费,自动显示在税费输入框!
输入售价后点击计算税费,自动显示在税费输入框!
69 0
输入售价后点击计算税费,自动显示在税费输入框!
|
JavaScript
Vue表单中判断当前行输入框的值与整个表单的输入框的值是否重复(过滤自身数据)
使用Element输入框自带change事件获取到scope.$index以及input框中的值(@change="change(scope,$event)"); 使用forEach遍历整个表单的数据(item是需要遍历的数组,index是数组中元素的下标);
434 0
Vue表单中判断当前行输入框的值与整个表单的输入框的值是否重复(过滤自身数据)
|
移动开发 JavaScript 前端开发
表单文本框的使用(二) 输入过滤(合成事件)
表单文本框的使用(二) 输入过滤(合成事件)
257 0