Java实现Luhm算法--银行卡号合法性校验

来源:互联网 发布:幽浮2 防御矩阵 编辑:程序博客网 时间:2024/04/28 15:51
银行卡是由”发卡行标识代码 + 自定义 + 校验码 “等部分组成的。
银联标准卡与以往发行的银行卡最直接的区别就是其卡号前6位数字的不同。  
银行卡卡号的前6位是用来表示发卡银行或机构的,称为“发卡行识别码”(Bank Identification Number,缩写为“BIN”)。  

银联标准卡是由国内各家商业银行(含邮储、信用社)共同发行、符合银联业务规范和技术标准、卡正面右下角带有“银联”标识(目前,新发行的银联标准卡一定带有国际化的银联新标识,新发的非银联标准卡使用旧的联网通用银联标识)、卡号前6位为622126至622925之一的银行卡,是中国银行卡产业共有的民族品牌。

package com.it.demo;import java.util.Scanner;public class LuhmTest {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("请输入银行卡号:");String bankNo = input.next();char res = getBankCardCheckCode(bankNo.substring(0, bankNo.length()-1));if(res!='N'){System.out.println("校验结果为:"+res);String charJX = bankNo.substring(bankNo.length()-1);//存入不含校验位的卡号System.out.println("银行卡的校验位为:"+charJX);if(charJX.equals(String.valueof(res))){System.out.println("银行卡合法!");}else{System.out.println("银行卡不合法!");}}}/** * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位 * 该校验的过程:      * 1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。      * 2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。      * 3、将奇数位总和加上偶数位总和,结果应该可以被10整除。 */public static char getBankCardCheckCode(String nonCheckCodeCardId){         if(nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0                 || !nonCheckCodeCardId.matches("\\d+")||nonCheckCodeCardId.trim().length()<15               ||nonCheckCodeCardId.trim().length()>18) {             //如果传的数据不合法返回N             System.out.println("银行卡号不合法!");           return 'N';       }         char[] chs = nonCheckCodeCardId.trim().toCharArray();         int luhmSum = 0;        // 执行luh算法       for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) {             int k = chs[i] - '0';             if(j % 2 == 0) {  //偶数位处理               k *= 2;                 k = k / 10 + k % 10;             }             luhmSum += k;                    }         return (luhmSum % 10 == 0) ? '0' : (char)((10 - luhmSum % 10) + '0');     }  }


0 0
原创粉丝点击