银行卡号每输四位加空格,及银行卡的识别(此银行卡号是那个银行)

1.先说第一个功能,银行卡每输四位加空格
1)我们要实现这个功能就需要去监听editText的输入,如下:
edit_view.addTextChangedListener(),此方法用于监听editText的输入,每输入一个字符此方法就会被调用,此监听事件有三个要实现的方法,如下:

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
}

这三个方法的执行顺序也是按照这三个方法的排列顺序来执行的,而我们逻辑处理的方法要放在onTextChanged()方法中去执行,至于为什么就不多说了,如果你们有时间就去自己试试吧,将逻辑代码放到其他方法中;

下面来看逻辑处理的代码:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
                int length = edit_view.getText().length();
                if (count == 1) {
                    if (length == 4) {
                        setLocation(length);
                    } else if (length == 9) {
                        setLocation(length);
                    } else if (length == 14) {
                        setLocation(length);
                    } else if (length == 19) {
                        setLocation(length);
                    }
             }

我们来解释一下这段代码,count==1表示是字符在增加的操作(也就是输入的操作),既然是每四位加一个空格,那么当length == 4 、9、14、19是要在其后面加空格的,这里的9、14、19是吧空格也算进去的长度,这应该好理解,下面看一下加空格的操作。

 private void setLocation(int length) {
        String str = edit_view.getText().toString();
        edit_view.setText(str + " ");
        Editable editable = edit_view.getText();
        //关键在这里,加完空格后要将光标移动到加完空格之后的位置
        Selection.setSelection(editable, length + 1);
    }

效果图如下(手机截的图,有点大抱歉啊):
这里写图片描述

到这里银行卡号每输四位加空格就已经搞定了,下面是第二个功能,一般情况下这两个功能都是放在一起使用的。

这个功能也是我在其他博客看到的,下面是原文链接:
http://blog.csdn.net/u013334392/article/details/52511743

银行卡的识别是根据银行卡号的前六位来识别的被称为bin号,想要识别银行卡号那么你就得有一个由很多bin号及bin号所对应的银行所构成的文本文档,数据库或其他什么东西,在输入完银行卡前六位后可以从这些东西当中获取相应的银行,我这里有一个文本文档存储了bin号所及其所对应的银行,下面是下载链接,你要将这个文本文档放到你的assets目录下。

bin号及其所对应银行文档的下载地址:http://download.csdn.net/detail/zhanglei280/9673851

代码如下:

/**
 * Created by zhanglei on 2016/11/5.
 * 根据银行卡前六位获取此卡号所对应的银行
 */
public class FindBankInfo {

    //该方法用于打开assets中的binNum文档资源,获得里面的binNum数据
    private static String openBinNum(Context context) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        String str = null;
        try {
            InputStream is = context.getResources().getAssets().open("binNum.txt");
            byte[] bytes = new byte[1024];
            int length = 0;
            while ((length = is.read(bytes)) != -1) {
                outputStream.write(bytes, 0, length);
            }
            is.close();
            outputStream.close();
            str = outputStream.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

    //获得Bank card的前缀
    private static List<Long> getBinNum(Context context) {
        String binNum = openBinNum(context);
        String[] binArr = binNum.split(",");
        List<Long> lon = new ArrayList<>();
        for (int i = 0; i < binArr.length; i++) {
            if (i % 2 == 0)
                lon.add(Long.parseLong(binArr[i]));

        }
        return lon;
    }

    //获得BankName

    private static List<String> getBinName(Context context) {
        String binNum = openBinNum(context);
        String[] binArr = binNum.split(",");
        List<String> list = new ArrayList<>();
        for (int i = 0; i < binArr.length; i++) {
            if (i % 2 != 0) list.add(binArr[i]);
        }
        return list;
    }

    //通过输入的卡号获得银行卡信息
    public static String getNameOfBank(Context context, long binNum) {
        Log.e("sangfei.code", "bankBin: " + binNum);
        int index = 0;
        index = binarySearch(getBinNum(context), binNum);
        if (index == -1) {
            return "未找到..";
        }
        return getBinName(context).get(index) + "";
    }

    //数量有上千条,利用二分查找算法来进行快速查找法

    public static int binarySearch(List<Long> srcArray, long des) {

        int low = 0;
        int high = srcArray.size() - 1;
        while (low <= high) {
            int middle = (low + high) / 2;
            if (des == srcArray.get(middle)) {
                return middle;
            } else if (des < srcArray.get(middle)) {
                high = middle - 1;
            } else {
                low = middle + 1;
            }
        }
        return -1;
    }

}

使用方法如下:

//获取银行卡的信息
String nameOfBank = FindBankInfo.getNameOfBank(mContext, 621462);

两个功能整合在一起后的代码如下,还是在onTextChanged()方法中去处理,只是多了一个setBankName()方法:

public void onTextChanged(CharSequence s, int start, int before, int count) {
                int length = number.getText().toString().length();
                if (count == 1) {
                    if (length == 4) {
                        setLocation(length);
                    } else if (length == 9) {
                        setLocation(length);
                    } else if (length == 14) {
                        setLocation(length);
                    } else if (length == 19) {
                        setLocation(length);
                    } else if (length == 7) {
                        setBankName();
                    }
                }
            }

setBankName()方法如下:

 /**
     * 设置银行名称
     *
     * @author zhagnlei
     * @date 16/11/5
     */
     private void setBankName() {
        String str = number.getText().toString();
        //去空格
        String replace = str.replace(" ", "");
        String bankName = FindBankInfo.getNameOfBank(mActivity, new Integer(replace));
        if (!bankName.equals("未找到..")) {
            blank.setEnabled(true);
            blank.setText(bankName);
        } else {
            blank.setEnabled(true);
            AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
            builder.setMessage("未找到银行卡所对应银行,请主动输入").setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
             public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            }).show();
        }

    }

上面是稍微复杂的操作,提供了在没有找到所对应银行的操作,下面是简单的操作:

 /**
     * 设置银行名称
     *
     * @author zhagnlei
     * @date 16/11/5
     */
 private void setBankName() {
     String str = number.getText().toString();
     //去空格
     String replace = str.replace(" ", "");
     String bankName = FindBankInfo.getNameOfBank(mActivity, new Integer(replace));
     blank.setText(bankName);
    }

好了大工告成。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值