银行卡号的检测

现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的,
可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。

16 位卡号校验位采用 Luhm 校验方法计算:

1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
3,将加法和加上校验位能被 10 整除。

比如卡号:

Java code
 
?
1
2
3
4
5
6
7
8
9
10
    6   2   2   5    8   8   1   4    1   4   2   0    7   4   3
*   2      2       2      2       2      2       2      2
--------------------------------------------------
   12   2   4   5   16   8   2   4    2   4   4      14   4   6
 
将上面的数字加和: 1 + 2 + 2 + 4 + 5 + 1 + 6 + 8 + 2 + 4 + 2 + 4 + 4 + 1 + 4 + 4 + 6  60
 
由于  60  加上  0  才能被  10  整除,所以校验位为  0
 
因此该卡号为  6225  8814  1420  7430



如果其中一位数字换掉的话,直接导致最后校验位错误。

写了个程序进行计算:

Java code
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public  class  Test5 {
 
     public  static  void  main(String[] args) {
         String card =  "622588141420743" ;
         System.out.println( "      card: "  + card);
         System.out.println( "check code: "  + getBankCardCheckCode(card));
         System.out.println( "   card id: "  + card + getBankCardCheckCode(card));
     }
     
     /**
      * 校验银行卡卡号
      * @param cardId
      * @return
      */
     public  static  boolean  checkBankCard(String cardId) {
         char  bit = getBankCardCheckCode(cardId.substring( 0 , cardId.length() -  1 ));
         return  cardId.charAt(cardId.length() -  1 ) == bit;        
     }
     
     /**
      * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位
      * @param nonCheckCodeCardId
      * @return
      */
     public  static  char  getBankCardCheckCode(String nonCheckCodeCardId) {
         if (nonCheckCodeCardId ==  null  || nonCheckCodeCardId.trim().length() ==  0
                 || !nonCheckCodeCardId.matches( "\\d+" )) {
             throw  new  IllegalArgumentException( "Bank card code must be number!" );
         }
         char [] chs = nonCheckCodeCardId.trim().toCharArray();
         int  luhmSum =  0 ;
         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' );
     }
}

转载于:https://www.cnblogs.com/manmanlu/p/4812725.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值