/**
*银行卡号Luhn校验算法
*luhn校验规则:16位银行卡号(19位通用):
*1.将未带校验位的 15(或18)位卡号从右依次编号 1 到 15(18),位于奇数位号上的数字乘以 2。
*2.将奇位乘积的个十位全部相加,再加上所有偶数位上的数字。
*3.将加法和加上校验位能被 10 整除。
*4.bankno为银行卡号
**/

function luhnCheck(bankno) {
let lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位(与luhn进行比较) let first15Num = bankno.substr(0, bankno.length - 1); //前15或18位
let newArr = new Array();
for (let i = first15Num.length - 1; i > -1; i--) { //前15或18位倒序存进数组
newArr.push(first15Num.substr(i, 1));
}
let arrJiShu = new Array(); //奇数位*2的积 <9
let arrJiShu2 = new Array(); //奇数位*2的积 >9 let arrOuShu = new Array(); //偶数位数组
for (let j = 0; j < newArr.length; j++) {
if ((j + 1) % 2 == 1) { //奇数位
if (parseInt(newArr[j]) * 2 < 9)
arrJiShu.push(parseInt(newArr[j]) * 2);
else
arrJiShu2.push(parseInt(newArr[j]) * 2);
} else //偶数位
arrOuShu.push(newArr[j]);
} let jishu_child1 = new Array(); //奇数位*2 >9 的分割之后的数组个位数
let jishu_child2 = new Array(); //奇数位*2 >9 的分割之后的数组十位数
for (let h = 0; h < arrJiShu2.length; h++) {
jishu_child1.push(parseInt(arrJiShu2[h]) % 10);
jishu_child2.push(parseInt(arrJiShu2[h]) / 10);
} let sumJiShu = 0; //奇数位*2 < 9 的数组之和
let sumOuShu = 0; //偶数位数组之和
let sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和
let sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和
let sumTotal = 0;
for (let m = 0; m < arrJiShu.length; m++) {
sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
} for (let n = 0; n < arrOuShu.length; n++) {
sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
} for (let p = 0; p < jishu_child1.length; p++) {
sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]);
sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]);
}
//计算总和
sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2); //计算luhn值
let k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10;
let luhn = 10 - k; if (lastNum == luhn) {
console.log("验证通过");
return true;
} else {
console.log("银行卡号必须符合luhn校验");
return false;
}
} //检查银行卡号
function CheckBankNo(_bankno) {
let bankno = _bankno.replace(/\s/g, '');
if (bankno == "") {
console.log("请填写银行卡号");
return false;
}
if (bankno.length < 16 || bankno.length > 19) {
console.log("银行卡号长度必须在16到19之间");
return false;
}
let num = /^\d*$/; //全数字
if (!num.exec(bankno)) {
console.log("银行卡号必须全为数字");
return false;
}
//开头6位
let 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";
if (strBin.indexOf(bankno.substring(0, 2)) == -1) {
console.log("银行卡号开头6位不符合规范");
return false;
}
//Luhn校验
if (!luhnCheck(bankno)) {
return false;
}
return true;
}
// 直接调用CheckBankNo方法即可
CheckBankNo(bankNo);
// 返回 true 或 false

最新文章

  1. JavaScript对异常的处理
  2. 使用Oracle的审计功能记录连接数据库登录失败的用户信息
  3. 。【自学总结 3】------3ds Max 主工具栏
  4. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列。开源啦!!!
  5. MAC如何直接管理安卓手机文件(转)
  6. web项目环境搭建(2):整合SpringMVC+velocity
  7. mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信
  8. &lt;经验杂谈&gt;C#/.Net字符串操作方法小结
  9. WPF页面切换及弹窗
  10. WebKit的历史项管理
  11. C++逗号运算符与逗号表达式
  12. cin 和scanf,scanf比cin快很多
  13. jmeter 使用jmeter 录制 手机APP脚本
  14. 重启mysql提示:The server quit without updating PID file问题的解决办法
  15. stickUp.js:98 Uncaught ReferenceError: vartop is not defined at HTMLDocument.&lt;anonymous&gt; (stickUp.js:98)
  16. poj 2570 Fiber Network(floyd)
  17. 跟未名学Office - PPT操作:高效
  18. go语言使用go-sciter创建桌面应用(六) Element元素操作和Event事件响应
  19. js中的prototype原型解析
  20. ASP.NET MVC:@helper 不能调试

热门文章

  1. 判断屏幕宽度px大小鉴别是移动设备或者PC
  2. Node流操作(启动器forever)
  3. [转帖]SOCKS5代理与HTTP代理
  4. BigData进阶--Spark中的函数与符号
  5. Yii2.0 queue
  6. MGR复制
  7. 版本管理工具svn(转)
  8. string库
  9. SpringCloud 配置文件 application.yml和 bootstrap.yml区别
  10. 帝国cms 通过栏目获取某个栏目的详情