生成银行卡号校验位和校验银行卡号_java实现银行验证位位生成-程序员宅基地

技术标签: 算法  java  前端  js  javascript  

  • 大多数银行卡为16位或19位,所以只支持16位或19位的银行卡
  • 最后一位是校验位,银行卡校验规则基于Luhn算法
  • 以卡号6212280200141664948为例
  • 校验过程为:
    1. 去掉校验位 8,得621228020014166494
    2. 卡号倒数偶数位相加,即 9 + 6 + 1 + 1 + 0 + 0 + 2 + 1 + 6 = 26
    3. 卡号倒数奇数位分别乘以2,即 4、4、6、4、0、2、8、2、2分别乘以2,
      得 8、8、12、8、0、4、16、4、4
    4. 奇数位乘以2得到的如果是两位数,则个位和十位相加(或两位数减去9),否则不变,例如 12 -> 1 + 2, 16-> 16 - 9,分别得到 8、8、3、8、0、4、7、4、4
    5. 将奇数位的计算结果相加, 即 8 + 8 + 3 + 8 + 0 + 4 + 7 + 4 + 4 = 46
    6. 将偶数位的计算结果与奇数位的计算结果相加,即 26 + 46 = 72
    7. 计算结果乘以10,取模得 72 mod 10 = 2
    8. 如果模为0,则校验位为0,否则校验位为2的补位,即 10 - 2 = 8

Java算法

package com.xxx.demo.common.util;

import java.util.regex.Pattern;

public final class AcctIdUtils {
    
	
	private static final Pattern acctCheckPattern = Pattern.compile("^(?:\\d{16}|\\d{19})$");
	
	private static final Pattern acctCreatePattern = Pattern.compile("^(?:\\d{15,16}|\\d{18,19})$");
	
	private AcctIdUtils () {
    }
	
	/**
	 * 校验银行卡号是否合法
	 * @param acctId 16位银行卡号或19位银行卡号
	 * @return true,银行卡号是否合法;else false
	 */
	public static boolean checkAcctId(String acctId) {
    
		if (acctId == null || !acctCheckPattern.matcher(acctId).matches()) {
    
			return false;
		}
		return acctId.equals(createAcctId(acctId));
	}

	/**
	 * 根据银行卡号前面的数字,生成完整的卡号
	 * @param acctId 有效数字为16位银行卡号的前15位,或19位银行卡号的前18位
	 * @return 完整的卡号
	 */
	public static String createAcctId(String acctId) {
    
		if (acctId == null || !acctCreatePattern.matcher(acctId).matches()) {
    
			return "";
		}
		int sum = 0;
		int lastIndex = acctId.length() < 17 ? 14 : 17;
		String preAcctId = acctId.substring(0, lastIndex + 1);
		for (int i = 0; i <= lastIndex; i++) {
    
			int unit = acctId.charAt(lastIndex - i) - '0';
			if ((i & 1) == 0) {
    
				if (unit < 5) {
    
					sum += unit * 2;
				} else {
    
					sum += unit * 2 - 9;
				}
			} else {
    
				sum += unit;
			}
		}
		int remainder = sum % 10;
		int checkCode = remainder == 0 ? 0 : 10 - remainder;
		return preAcctId + checkCode;
		
	}

}

JavaScript算法

(function (window) {
    
    /**
     * 根据银行卡号前面的数字,生成完整的卡号
     * @param acctId 有效数字为16位银行卡号的前15位,或19位银行卡号的前18位
     * @return string 完整的卡号
     */
    var createAcctId = function (acctId) {
    
        if (!acctId || !/^(?:\d{15,16}|\d{18,19})$/g.test(acctId)) {
    
            return '';
        }
        acctId = '' + acctId;
        var sum = 0;
        var lastIndex = acctId.length < 17 ? 14 : 17;
        var preAcctId = acctId.substring(0, lastIndex + 1);
        for (var i = 0; i <= lastIndex; i++) {
    
            var unit = acctId.charAt(lastIndex - i) - '0';
            if ((i & 1) === 0) {
    
                if (unit < 5) {
    
                    sum += unit * 2;
                } else {
    
                    sum += unit * 2 - 9;
                }
            } else {
    
                sum += unit;
            }
        }
        var remainder = sum % 10;
        var checkCode = remainder === 0 ? 0 : 10 - remainder;
        return preAcctId + checkCode;
    };

    /**
     * 校验银行卡号是否合法
     * @param acctId 16位银行卡号或19位银行卡号
     * @return boolean true,银行卡号是否合法;else false
     */
    var checkAcctId = function (acctId) {
    
        if (!acctId || !/^(?:\d{16}|\d{19})$/g.test(acctId)) {
    
            return false;
        }
        acctId = '' + acctId;
        return acctId === createAcctId(acctId);
    };

    window.checkAcctId = checkAcctId;
    window.createAcctId = createAcctId;
})(window);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/daodfs111/article/details/118737031

智能推荐

Oracle ERP中的PDH应用-程序员宅基地

文章浏览阅读121次。Oracle PDH虽然并不是标准的PLM产品,但作为Oracle电子商务套件的有效补充,在流程控制方面的增强有效补充Oracle BOM/ENG等传统模块在产品信息管理方面的不足,对于已经实施了Oralce ERP..._pdh应用

Delphi自定义了一个消息 范例-程序员宅基地

文章浏览阅读80次。//自己定义了一个消息范例unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;constmy_messagedisp=Wm_user+201;..._delphi短信模板文字

HTML5元素表-程序员宅基地

文章浏览阅读153次。HTML5元素表文本元素超链接页面目标<a href ="目标">内容 </a>链接的目标(路径)可以是相对地址也可以是绝对地址。emment插件CTRL+D 复制光标所在行的内容锚点当前页面的跳转格式:1.ID属性的元素2.a中href的值是 (# + 1的属性值)功能a元素书写..._html5元素表

解决 mysql.sock 丢失问题_宝塔 /tmp/mysql.sock 不见了-程序员宅基地

文章浏览阅读733次。mysql.sock 找不到问题解决方案[wangyuanyuan14@wangyuanyuan14 download]$ find ~/ -name mysql_install_db/home/users/wangyuanyuan14/.jumbo/bin/mysql_install_db[wangyuanyuan14@wangyuanyuan14 download]$ cd /home/users/wangyuanyuan14/.jumbo/[wangyuanyuan14@wangyuany_宝塔 /tmp/mysql.sock 不见了

sqlserver 2014 删除主键约束-程序员宅基地

文章浏览阅读679次。select * from dict where DictCode != '' and PId=5truncate table menuSELECT * FROM sys.foreign_keysWHERE referenced_object_id=OBJECT_ID('menu'); --找到引用该表的外键--ALTER TABLE dbo.XX DROP con..._sqlserver 去除主键

IOS详解TableView——选项抽屉(天猫商品列表)-程序员宅基地

文章浏览阅读34次。在之前的有篇文章讲述了利用HeaderView来写类似QQ好友列表的表视图。这里写的天猫抽屉其实也可以用该方法实现,具体到细节每个人也有所不同。这里采用的是点击cell对cell进行运动处理以展开“抽屉”。最后完成的效果大概是这个样子。 主要的环节:点击将可视的Cell动画弹开。其他的Cell覆盖一层半透明视图,将视线焦点集中在弹出来的商品细分类别中。..._uitableview 实现商品分类

随便推点

Chrome Dev Tool 中时间线各阶段代表的意义_浏览器计划已排队时间-程序员宅基地

文章浏览阅读798次。Queueing(排队时间)如果某个请求正在排队,则指示:请求已被渲染引擎推迟,因为该请求的优先级被视为低于关键资源(例如脚本/样式)的优先级。 图像经常发生这种情况。请求已被暂停,以等待将要释放的不可用 TCP 套接字。请求已被暂停,因为在 HTTP 1 上,浏览器仅允许每个源拥有六个 TCP 连接。生成磁盘缓存条目所用的时间(通常非常迅速)Stalled(也即是从TCP连接建立完成,到真正可以..._浏览器计划已排队时间

关于多核系统同步互斥的小研究-程序员宅基地

文章浏览阅读216次。   在多核系统中,会存在多个CPU核竞争同一资源的情形,这就必须有一些机制来保证在竞争中不会出现错误,即同步互斥机制。这里主要针对同步互斥原语之一的自旋锁进行一点分析和记录。上图为一个多核系统的中断部分,很显然中断部分会存在许多竞争相关问题。自旋锁(Spinlock)  自旋锁是用来在多处理器环境中工作的一种特殊的锁,用于控制共享资源的访问,是一种同步原语。当一个CPU正访问自旋锁..._xchg总线

react-native-android-guide_reactnative guide-程序员宅基地

文章浏览阅读1k次。react-native-android-guide 。 地址:https://github.com/jiangqqlmj/react-native-android-guidereact-native,解决了原生app,开发周期长,开发成本高,升级代价大的问题.或许你还在犹豫,一门新的语言让他再发展发展再学也不迟,但是在中国你懂的,学技术要从技术还是娃娃的时候学起。_reactnative guide

基础篇1:关键字、保留字、标识符、变量_程序中, 保留关键字, 类型说明符, 变量名,-程序员宅基地

文章浏览阅读186次。关键字、保留字、标识符、变量_程序中, 保留关键字, 类型说明符, 变量名,

Android ContentProvider结合Room保存数据库_contentprovider 保存数据库 表-程序员宅基地

文章浏览阅读3.2k次。ContentProvider结合Room保存数据库ContentProvider结合Room保存数据库1. ContentProvider使用理解执行顺序重写Provider的增删改查方法使用Provider的增删改查方法2. Room单独使用@Database不使用@Entity如何创建表(SupportSQLiteDatabase)不使用@Dao如何管理表(SupportSQLiteDatabase)ContentProvider结合Room保存数据库1. ContentProvider使用理解_contentprovider 保存数据库 表

html引入css webpack_html引入css文件-程序员宅基地

文章浏览阅读433次。在HTML中,引入CSS的方法主要有行内式、内嵌式、导入式和链接式。行内式:即在标记的style属性中设定CSS样式,这种方式本质上没有体现出CSS的优势,因此不推荐使用。例:Text DemoThis is a line of Text.嵌入式:嵌入式则将对页面中各种元素的设置集中写在和之间,对于单一的网页,这种方法很方便。但是对于一个包含很多页面的网站,如果每个页面都以内嵌方式设置各自的样式,..._webpack html 引入css

推荐文章

热门文章

相关标签