银行卡号Luhm校验Java实现代码

  1 import java.util.regex.Matcher;
  2 import java.util.regex.Pattern;
  3
  4 public class CheckBankNumber {
  5
  6
  7     //Description:  银行卡号Luhm校验
  8
  9     //Luhm校验规则:16位银行卡号(19位通用):
 10
 11     // 1.将未带校验位的 15(或18)位卡号从右依次编号 1 到 15(18),位于奇数位号上的数字乘以 2。
 12     // 2.将奇位乘积的个十位全部相加,再加上所有偶数位上的数字。
 13     // 3.将加法和加上校验位能被 10 整除。
 14
 15
 16     //开头6位
 17     //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";
 18
 19     private final static String SUCCESS="true";
 20
 21     private final static String BAD_LENGTH="银行卡号长度必须在16到19之间";
 22
 23     private final static String NOT_NUMBER="银行卡必须全部为数字";
 24
 25     private final static String ILLEGAL_NUMBER="银行卡不符合规则";
 26
 27     public static String luhmCheck(String bankno){
 28         if (bankno.length() < 16 || bankno.length() > 19) {
 29             return BAD_LENGTH;
 30             }
 31
 32         Pattern pattern = Pattern.compile("[0-9]*");
 33         Matcher match = pattern.matcher(bankno);
 34         if (match.matches() == false) {
 35             return NOT_NUMBER;
 36         }
 37
 38 //        if (strBin.indexOf(bankno.substring(0, 2)) == -1) {
 39 //        return "银行卡号开头6位不符合规范";
 40 //        }
 41
 42         int lastNum=Integer.parseInt(bankno.substring(bankno.length()-1,bankno.length()));//取出最后一位(与luhm进行比较)
 43
 44         String first15Num=bankno.substring(0,bankno.length()-1);//前15或18位
 45         //System.out.println(first15Num);
 46         char[] newArr = new char[first15Num.length()];    //倒叙装入newArr
 47         char[] tempArr = first15Num.toCharArray();
 48         for(int i = 0; i < tempArr.length ; i++){
 49             newArr[tempArr.length-1-i] = tempArr[i];
 50         }
 51         //System.out.println(newArr);
 52
 53
 54         int[] arrSingleNum = new int[newArr.length]; //奇数位*2的积 <9
 55         int[] arrSingleNum2 = new int[newArr.length];//奇数位*2的积 >9
 56         int[] arrDoubleNum=new int[newArr.length];  //偶数位数组
 57
 58         for(int j = 0;j < newArr.length; j++){
 59             if((j+1)%2==1){//奇数位
 60                 if((int)(newArr[j]-48)*2<9)
 61                     arrSingleNum[j]=(int)(newArr[j]-48)*2;
 62                 else
 63                     arrSingleNum2[j]=(int)(newArr[j]-48)*2;
 64             }
 65             else //偶数位
 66                 arrDoubleNum[j]=(int)(newArr[j]-48);
 67         }
 68
 69         int[] arrSingleNumChild = new int[newArr.length]; //奇数位*2 >9 的分割之后的数组个位数
 70         int[] arrSingleNum2Child = new int[newArr.length];//奇数位*2 >9 的分割之后的数组十位数
 71
 72         for(int h=0;h<arrSingleNum2.length;h++){
 73             arrSingleNumChild[h] = (arrSingleNum2[h])%10;
 74             arrSingleNum2Child[h] = (arrSingleNum2[h])/10;
 75         }
 76
 77         int sumSingleNum=0; //奇数位*2 < 9 的数组之和
 78         int sumDoubleNum=0; //偶数位数组之和
 79         int sumSingleNumChild=0; //奇数位*2 >9 的分割之后的数组个位数之和
 80         int sumSingleNum2Child=0; //奇数位*2 >9 的分割之后的数组十位数之和
 81         int sumTotal=0;
 82         for(int m=0;m<arrSingleNum.length;m++){
 83             sumSingleNum=sumSingleNum+arrSingleNum[m];
 84         }
 85
 86         for(int n=0;n<arrDoubleNum.length;n++){
 87             sumDoubleNum=sumDoubleNum+arrDoubleNum[n];
 88         }
 89
 90         for(int p=0;p<arrSingleNumChild.length;p++){
 91             sumSingleNumChild=sumSingleNumChild+arrSingleNumChild[p];
 92             sumSingleNum2Child=sumSingleNum2Child+arrSingleNum2Child[p];
 93         }
 94
 95         sumTotal=sumSingleNum+sumDoubleNum+sumSingleNumChild+sumSingleNum2Child;
 96
 97         //计算Luhm值
 98         int k= sumTotal%10==0?10:sumTotal%10;
 99         int luhm= 10-k;
100
101         if(lastNum == luhm){
102             return SUCCESS;//验证通过
103         }
104         else{
105             return ILLEGAL_NUMBER;
106         }
107     }
108
109     public static void main(String[] args) {
110         String bankno = "6214857110432079";
111         System.out.println(bankno+":"+luhmCheck(bankno));
112         String bankno1 = "6212164000046323291";
113         System.out.println(bankno1+":"+luhmCheck(bankno1));
114         String bankno2 = "6222023104004123546";
115         System.out.println(bankno2+":"+luhmCheck(bankno2));
116     }
117 }
时间: 2024-10-22 23:37:59

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

二代身份证号码校验 Java版

未命名 import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.regex.Pattern;public class IdCardValidator {    public static void main(String[] args) {        System.out.printl

编写高质量JAVA程序代码的建议

--------------------------------------------------------------------------------------------------- 前言:原著<改善JAVA程序的151个建议>有151个建议,我在拜读的过程根据自己的理解合并了其中的几个,并将每个建议的核心要义进行了一次纯手工提炼,以方便想阅读这本书的同行能够更快的掌握这本书的所有核心内容. -------------------------------------------

Java静态代码分析工具Infer

Java静态代码分析工具Infer 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Infer介绍 Infer是Facebook最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题.目前Facebook使用此工具分析Facebook的App,包括Android.iOS.Facebook Messenger和Instagram等. Facebook称该工具帮助其每个月检查出应用潜在的数百个Bug,例如一些空指针访问.资源

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

转载自: http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中. 引言 在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代

左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用

文章标题:左右JAVA示例代码事件分发和监督机制来实现 文章地址: http://blog.csdn.net/5iasp/article/details/37054171 作者: javaboy2012Email:[email protected]qq:    1046011462 一.场景如果 如果有博客系统中须要实现例如以下功能: 系统中用户公布文章.改动文章.删除文章时,须要一些相关的操作须要运行. 公布文章后,给好友发送邮件通知.给用户加积分,对文章做全文索引. 改动文章后,给好友发送邮

java实现代码高亮

1 package JavaSyntaxHighterDemo; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.InputStreamReader; 7 import java.util.Arrays; 8 import java.util.HashSet; 9 import java.util.Set; 10 11 /**

转载——Java与WCF交互(一)补充:用WSImport生成WSDL的Java客户端代码

在<Java与WCF交互(一):Java客户端调用WCF服务>一文中,我描述了用axis2的一个Eclipse控件生成WCF的Java客户端代理类,后来有朋友建议用Xfire.CXF,一直没有尝试,今天有朋友指出JDK6可以用java自带的一个WSImport工具,试了下,果然很爽,这是一个exe文件,位于%JAVA_HOME%\bin下,它的官方使用说明,见:http://download-llnw.oracle.com/javase/6/docs/technotes/tools/share

入门级的Java Socket代码

在男友手把手的指导下,写出第一个类似于"hello world"的socket程序. 男友要求: 1. 程序以命令行方式运行,在两台联网的电脑上分别运行: 2. 一台电脑的命令行中输入"程序名称 wait",运行程序,进入监听状态: 3. 一台电脑的命令行中输入"程序名称 ip地址",运行程序,连接另一台电脑: 4. 两台电脑均可发送接收消息. 分析流程图: 附代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1

第五届蓝桥杯练习题 - 入门练习Java解题代码

>>入门训练 圆的面积 时间限制:1.0s   内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个整数,但是输出是一个实数. 对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误. 实数输出的问题