银行卡号Luhm校验Java实现代码
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实现代码的更多相关文章
- Regexp-Utils:银行卡号Luhm校验
ylbtech-Regexp-Utils:银行卡号Luhm校验 1.返回顶部 1.方法 //Description: 银行卡号Luhm校验 //Luhm校验规则:16位银行卡号(19位通用): // ...
- 银行卡luhm校验算法
/** * 15位银行卡luhm校验算法 * 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. * 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 ...
- Java实现Luhm算法--银行卡号合法性校验
银行卡是由"发卡行标识代码 + 自定义 + 校验码 "等部分组成的. 银联标准卡与以往发行的银行卡最直接的区别就是其卡号前6位数字的不同. 银行卡卡号的前6位是用来表示发卡银行 ...
- pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页
java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...
- 经典KMP算法C++与Java实现代码
前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...
- FastDFS搭建及java整合代码【转】
FastDFS软件介绍 1.什么是FastDFS FastDFS是用C语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高 ...
- [原创]Java静态代码检查工具介绍
[原创]Java静态代码检查工具介绍 一 什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...
随机推荐
- ASP.net中的Cache使用介绍
1.1.1 摘要(http://www.cnblogs.com/rush/archive/2012/06/30/2571438.html) 最近我们的系统面临着严峻性能瓶颈问题,这是由于访问量增加,客 ...
- Android的横竖屏切换
android的横竖屏切换,也会发生不少问题. 1. 锁定屏幕方向,禁止切换: 在AndroidManifest.xml中的Activity参数中加上 android:screenOrientat ...
- Andorid4.x 流氓式屏蔽HOME键
转载请列明出处 http://blog.csdn.net/steelychen/article/details/37757341 应用项目须要要屏蔽HOME键. 项目本身的要求是让按下HOME键后程序 ...
- Nginx与Tomcat、Client之间请求的长连接配置不一致问题解决[转]
http://bert82503.iteye.com/blog/2152613 前些天,线上出现“服务端长连接与客户端短连接引起Nginx的Writing.Active连接数过高问题”,这个是由于“服 ...
- [MODx] 6. Cache '!' with login package
1. Install login package. 2. Create a Template called 'login': [[!Login? &loginResourceId=`13` / ...
- 返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方.return语句有两种形式: return; return expression; 无返回值函数 没有返回值的return语句只 ...
- UNIX标准化及实现之功能测试宏
在头文件中定义了很多POSIX.1和XSI的符号.但是除了POSIX.1和XSI的定义之外,大多数实现在这些头文件中也加上了它们自己的定义.如果在编译一个程序时,希望它只使用POSIX定义而不使用任何 ...
- android Popupwindow 的一个demo源码
一直想用一下PopupWindow,就是苦于没有demo,自己去研究有太懒,刚好最近研究推送,下载了一个腾讯信鸽的demo,里面用到了一个PopupWindow,效果还不错,弄下来记录一下: 1.核心 ...
- 【转】cocos2d-x 2.0版本 自适应屏幕分辨率
http://codingnow.cn/cocos2d-x/975.html 我使用的版本是cocos2d-2.0-x-2.0.4,cocos2dx-2.0版本对多分辨率适配提供了很好的支持,使用起来 ...
- React Editor 应用编辑器(1) - 拖拽功能剖析
这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...