import java.util.regex.Matcher;
 import java.util.regex.Pattern;

 public class CheckBankNumber {

     //Description:  银行卡号Luhm校验

     //Luhm校验规则:16位银行卡号(19位通用):

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

     //开头6位
     //private  final static String strBin = "10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99";

     private final static String SUCCESS="true";

     private final static String BAD_LENGTH="银行卡号长度必须在16到19之间";

     private final static String NOT_NUMBER="银行卡必须全部为数字";

     private final static String ILLEGAL_NUMBER="银行卡不符合规则";

     public static String luhmCheck(String bankno){
         if (bankno.length() < 16 || bankno.length() > 19) {
             return BAD_LENGTH;
             }

         Pattern pattern = Pattern.compile("[0-9]*");
         Matcher match = pattern.matcher(bankno);
         if (match.matches() == false) {
             return NOT_NUMBER;
         }

 //        if (strBin.indexOf(bankno.substring(0, 2)) == -1) {
 //        return "银行卡号开头6位不符合规范";
 //        }

         int lastNum=Integer.parseInt(bankno.substring(bankno.length()-1,bankno.length()));//取出最后一位(与luhm进行比较)

         String first15Num=bankno.substring(0,bankno.length()-1);//前15或18位
         //System.out.println(first15Num);
         char[] newArr = new char[first15Num.length()];    //倒叙装入newArr
         char[] tempArr = first15Num.toCharArray();
         for(int i = 0; i < tempArr.length ; i++){
             newArr[tempArr.length-1-i] = tempArr[i];
         }
         //System.out.println(newArr);

         int[] arrSingleNum = new int[newArr.length]; //奇数位*2的积 <9
         int[] arrSingleNum2 = new int[newArr.length];//奇数位*2的积 >9
         int[] arrDoubleNum=new int[newArr.length];  //偶数位数组

         for(int j = 0;j < newArr.length; j++){
             if((j+1)%2==1){//奇数位
                 if((int)(newArr[j]-48)*2<9)
                     arrSingleNum[j]=(int)(newArr[j]-48)*2;
                 else
                     arrSingleNum2[j]=(int)(newArr[j]-48)*2;
             }
             else //偶数位
                 arrDoubleNum[j]=(int)(newArr[j]-48);
         }

         int[] arrSingleNumChild = new int[newArr.length]; //奇数位*2 >9 的分割之后的数组个位数
         int[] arrSingleNum2Child = new int[newArr.length];//奇数位*2 >9 的分割之后的数组十位数

         for(int h=0;h<arrSingleNum2.length;h++){
             arrSingleNumChild[h] = (arrSingleNum2[h])%10;
             arrSingleNum2Child[h] = (arrSingleNum2[h])/10;
         }    

         int sumSingleNum=0; //奇数位*2 < 9 的数组之和
         int sumDoubleNum=0; //偶数位数组之和
         int sumSingleNumChild=0; //奇数位*2 >9 的分割之后的数组个位数之和
         int sumSingleNum2Child=0; //奇数位*2 >9 的分割之后的数组十位数之和
         int sumTotal=0;
         for(int m=0;m<arrSingleNum.length;m++){
             sumSingleNum=sumSingleNum+arrSingleNum[m];
         }

         for(int n=0;n<arrDoubleNum.length;n++){
             sumDoubleNum=sumDoubleNum+arrDoubleNum[n];
         }

         for(int p=0;p<arrSingleNumChild.length;p++){
             sumSingleNumChild=sumSingleNumChild+arrSingleNumChild[p];
             sumSingleNum2Child=sumSingleNum2Child+arrSingleNum2Child[p];
         }      

         sumTotal=sumSingleNum+sumDoubleNum+sumSingleNumChild+sumSingleNum2Child;

         //计算Luhm值
         int k= sumTotal%10==0?10:sumTotal%10;
         int luhm= 10-k;

         if(lastNum == luhm){
             return SUCCESS;//验证通过
         }
         else{
             return ILLEGAL_NUMBER;
         }
     }

     public static void main(String[] args) {
         String bankno = "6214857110432079";
         System.out.println(bankno+":"+luhmCheck(bankno));
         String bankno1 = "6212164000046323291";
         System.out.println(bankno1+":"+luhmCheck(bankno1));
         String bankno2 = "6222023104004123546";
         System.out.println(bankno2+":"+luhmCheck(bankno2));
     }
 }

银行卡号Luhm校验Java实现代码的更多相关文章

  1. Regexp-Utils:银行卡号Luhm校验

    ylbtech-Regexp-Utils:银行卡号Luhm校验 1.返回顶部 1.方法 //Description: 银行卡号Luhm校验 //Luhm校验规则:16位银行卡号(19位通用): // ...

  2. 银行卡luhm校验算法

    /** * 15位银行卡luhm校验算法 * 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. * 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 ...

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

    银行卡是由"发卡行标识代码 + 自定义 + 校验码 "等部分组成的. 银联标准卡与以往发行的银行卡最直接的区别就是其卡号前6位数字的不同.   银行卡卡号的前6位是用来表示发卡银行 ...

  4. pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页

    java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...

  5. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

  6. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  7. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  8. FastDFS搭建及java整合代码【转】

    FastDFS软件介绍 1.什么是FastDFS FastDFS是用C语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高 ...

  9. [原创]Java静态代码检查工具介绍

    [原创]Java静态代码检查工具介绍 一  什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...

随机推荐

  1. mysql select 报错

    代码片段: sql_url = "select * from webpage where url = '%s'" % b try: cursor.execute(sql_url) ...

  2. android131 360 02 设置中心

    // 判断是否需要自动更新 boolean autoUpdate = mPref.getBoolean("auto_update", true); if (autoUpdate) ...

  3. 隐式Intent实例

    注意:The <strong>categories</strong>, if supplied, must <em>all</em> be listed ...

  4. 【转】int const A::func()和int A::func() const

    int const A::func() { return 0; }int A::func() const { return 0; } 上面的代码是合法的,其中A::func成员函数[只能在成员函数后面 ...

  5. JAVA_eclipse 保留Java文件时自动格式化代码和优化Import

    Eclipse 保存Java文件时自动格式化代码和优化Import Eclipse中format代码的快捷方式是ctrl+shift+F,如果大家想保存 java文件的时候 自动就格式化代码+消除不必 ...

  6. famous javascript library.

    https://famo.us/ THE ULTIMATE WEB PLATFORM FOR DEVELOPERS AND DESIGNERS

  7. 如何在ios手机端的Safari浏览器 中“查看网页源代码”

    在这里给大家分享一个很简单的用苹果手机无需越狱就可以查看网页源代码的方法,不过这个方法只用于苹果手机自带的Safari浏览器 随便添加一个safari 书签 (用于一会改为查看源码功能书签)进入书签 ...

  8. QQ粘性效果

    演示如下 QQ粘性效果.zip

  9. Visual Studio.NET、asp.net和C#间的关系是怎样的?

    asp.net是一种技术,要实现这种技术,就得有底层的实现技术编程语言,这个语言就是C#,(只是绝大多数首选C#),要想用C#实现asp.net技术,就得有编程的工具软件,这个软件我一直用visual ...

  10. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序

    如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置.参考配置如下:<?xml version="1.0" enco ...