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

银行卡是由”发卡行标识代码 + 自定义 + 校验码 “等部分组成的。
银联标准卡与以往发行的银行卡最直接的区别就是其卡号前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');  
	   }  

}


posted on 2016-07-31 21:26  菜鸟Z  阅读(337)  评论(0编辑  收藏  举报

导航