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');
}
}
Java实现Luhm算法--银行卡号合法性校验的更多相关文章
- 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验
开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...
- 银行卡号Luhn校验算法
/** *银行卡号Luhn校验算法 *luhn校验规则:16位银行卡号(19位通用): *1.将未带校验位的 15(或18)位卡号从右依次编号 1 到 15(18),位于奇数位号上的数字乘以 2. * ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- Java 检查IPv6地址的合法性
Java 检查IPv6地址的合法性 由于IPv4资源即将耗尽,IPv6将要正式启用,这是大势所趋. 一些现有的服务和应用逐步要对IPv6支持,目前还处在过渡阶段. 提前了解一些IPv6的知识,还是有必 ...
- java加解密算法
什么是加密算法?百度百科给出的解释如下: 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容, ...
- java自定义注解实现前后台参数校验
2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- Java字符串排列算法
Java字符串排列算法 题目:现有ABCDE 5个球 构成的排列组合 可重复抽取 最多取到16个 共有多少种组合方式? 比如:取1个球可以构成的组合有 A B C D E 共5种,取2个球可以构成的组 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
随机推荐
- Oracle与MySQL的区别对比
本文对数据库Oracle与MySQL进行了区别对比,其中从并发性.一致性.事务.数据持久性等十三方面进行了对比. 本文摘自 51cto 一.并发性 并发性是oltp数据库最重要的特性,但并发涉及到资源 ...
- 产品对话 | 愿云原生不再只有Kubernete
从2013年,云原生(Cloud Native)的概念由 Pivotal 的 MattStine 首次提出,到现在,其技术细节不断得到社区的完善.云原生逐渐演变出包括 DevOps.持续交付.微服务. ...
- c语言中命令行参数argc,argv[]详解
main(int argc,char *argv[ ]) 1.argc为整数 2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[ ...
- C++常用库函数 C函数库 cstdio
常用的C/C++函数库, cstdio(stdio.h) 标准输入输出库.C Standard Input and Output Library 1. 实例 #include <cstdio&g ...
- macOS更新失败解决
下载离线更新包解决. https://support.apple.com/downloads/combo
- java基本类型和包装类型
int 是基本类型,直接存数值 Integer是类,产生对象时用一个引用指向这个对象 Java把内存划分成两种:一种是栈内存,另一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变 ...
- 二分查找(python)
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/4/29 9:11 # @Author : Jackendoff # @Sit ...
- Scapy-ARPspoof学习
layout title tag date post Scapy模块学习之ARP欺骗 Python 2018-05-08 from scapy.all import Ether,ARP,sendp,g ...
- oracle_(第三课)网络服务配置
1.打开Net Manager 2.开始配置 3.检测 4.SQL Developer 检测 新创数据库连接,连接类型选择 TNS ,若在网络别名中能看到MYORCL,则证明你成功了
- Part-Selenium-1
1.在浏览器中的console输入:帮助定位 > $x('xpath表达式') > $('css表达式') 2.driver > chrome driver: https://npm ...