• 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');  
    	   }  
    
    }


  • 相关阅读:
    乱码解决
    Collection接口
    YTU EDG Vince Day Training -- 训练赛赛后总结
    Codeforces Round #751 (Div. 2) A. Two Subsequences
    Codeforces Round #750 (Div. 2) C. Grandma Capa Knits a Scarf
    Codeforces Round #745 (Div. 2) B. Diameter of Graph
    Codeforces Round #745 (Div. 2) A. CQXYM Count Permutations
    ytuoj-3328 快速幂
    Codeforces Round #746 (Div. 2) C. Bakry and Partitioning
    Codeforces Round #747 (Div. 2) B. Special Numbers
  • 原文地址:https://www.cnblogs.com/archermeng/p/7537293.html
Copyright © 2020-2023  润新知