zoukankan      html  css  js  c++  java
  • 前端JS校验银行卡卡号和身份证号码(附ES6版方法)

    1、银行卡卡号校验方法。

    function luhnCheck(bankno) {
    var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位(与luhn进行比较)
    var first15Num = bankno.substr(0, bankno.length - 1); //前15或18位
    var newArr = new Array();
    for (var i = first15Num.length - 1; i > -1; i--) { //前15或18位倒序存进数组
    newArr.push(first15Num.substr(i, 1));
    }
    var arrJiShu = new Array(); //奇数位*2的积 <9
    var arrJiShu2 = new Array(); //奇数位*2的积 >9
    var arrOuShu = new Array(); //偶数位数组
    for (var 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]);
    }

    var jishu_child1 = new Array(); //奇数位*2 >9 的分割之后的数组个位数
    var jishu_child2 = new Array(); //奇数位*2 >9 的分割之后的数组十位数
    for (var h = 0; h < arrJiShu2.length; h++) {
        jishu_child1.push(parseInt(arrJiShu2[h]) % 10);
        jishu_child2.push(parseInt(arrJiShu2[h]) / 10);
    }

    var sumJiShu = 0; //奇数位*2 < 9 的数组之和
    var sumOuShu = 0; //偶数位数组之和
    var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和
    var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和
    var sumTotal = 0;
    for (var m = 0; m < arrJiShu.length; m++) {
        sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
    }

    for (var n = 0; n < arrOuShu.length; n++) {
        sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
    }

    for (var 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值
    var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10;
    var luhn = 10 - k;

    if (lastNum == luhn) {
     return true;
        } else {
             return false;
        }
    }
     
    2、身份证号校验
     
    var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子
    var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]; // 身份证验证位值.10代表X
    function IdCardValidate(idCard) {
    idCard = trim(idCard.replace(/ /g, "")); //去掉字符串头尾空格
    if (idCard.length == 15) {
    return isValidityBrithBy15IdCard(idCard); //进行15位身份证的验证
    } else if (idCard.length == 18) {
    var a_idCard = idCard.split(""); // 得到身份证数组
    if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){ //进行18位身份证的基本验证和第18位的验证
    return true;
    }else {
    return false;
    }
    } else {
    return false;
    }
    }

    /**
    * 判断身份证号码为18位时最后的验证位是否正确
    * @param a_idCard 身份证号码数组
    * @return
    */
    function isTrueValidateCodeBy18IdCard(a_idCard) {
    var sum = 0; // 声明加权求和变量
    if (a_idCard[17].toLowerCase() == 'x') {
    a_idCard[17] = 10; // 将最后位为x的验证码替换为10方便后续操作
    }
    for ( var i = 0; i < 17; i++) {
    sum += Wi[i] * a_idCard[i]; // 加权求和
    }
    valCodePosition = sum % 11; // 得到验证码所位置
    if (a_idCard[17] == ValideCode[valCodePosition]) {
    return true;
    } else {
    return false;
    }
    }
    /**
    * 验证18位数身份证号码中的生日是否是有效生日
    * @param idCard 18位书身份证字符串
    * @return
    */
    function isValidityBrithBy18IdCard(idCard18){
    var year = idCard18.substring(6,10);
    var month = idCard18.substring(10,12);
    var day = idCard18.substring(12,14);
    var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));
    // 这里用getFullYear()获取年份,避免千年虫问题
    if(temp_date.getFullYear()!=parseFloat(year)
    ||temp_date.getMonth()!=parseFloat(month)-1
    ||temp_date.getDate()!=parseFloat(day)){
    return false;
    }else{
    return true;
    }
    }
    /**
    * 验证15位数身份证号码中的生日是否是有效生日
    * @param idCard15 15位书身份证字符串
    * @return
    */
    function isValidityBrithBy15IdCard(idCard15){
    var year = idCard15.substring(6,8);
    var month = idCard15.substring(8,10);
    var day = idCard15.substring(10,12);
    var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));
    // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
    if(temp_date.getYear()!=parseFloat(year)
    ||temp_date.getMonth()!=parseFloat(month)-1
    ||temp_date.getDate()!=parseFloat(day)){
    return false;
    }else{
    return true;
    }
    }
    //去掉字符串头尾空格
    function trim(str) {
    return str.replace(/(^s*)|(s*$)/g, "");
    }
     
     
    ES6版校验方法
     
    1、银行卡校验
    export function bankCardValidate(bankno) {
    const lastNum = +bankno.substr(bankno.length - 1, 1);
    const first15Num = bankno.substr(0, bankno.length - 1);
    const newArr = [];
    for (let i = first15Num.length - 1; i > -1; i -= 1) {
    newArr.push(first15Num.substr(i, 1));
    }
    const arrJiShu = [];
    const arrJiShu2 = [];
    const arrOuShu = [];
    for (let j = 0; j < newArr.length; j += 1) {
    if ((j + 1) % 2 === 1) {
    if (parseInt(newArr[j], 10) * 2 < 9) {
    arrJiShu.push(parseInt(newArr[j], 10) * 2);
    } else {
    arrJiShu2.push(parseInt(newArr[j], 10) * 2);
    }
    } else {
    arrOuShu.push(newArr[j]);
    }
    }

    const jishuChild1 = [];
    const jishuChild2 = [];
    for (let h = 0; h < arrJiShu2.length; h += 1) {
    jishuChild1.push(parseInt(arrJiShu2[h], 10) % 10);
    jishuChild2.push(parseInt(arrJiShu2[h], 10) / 10);
    }

    let sumJiShu = 0;
    let sumOuShu = 0;
    let sumJiShuChild1 = 0;
    let sumJiShuChild2 = 0;
    let sumTotal = 0;
    for (let m = 0; m < arrJiShu.length; m += 1) {
    sumJiShu += parseInt(arrJiShu[m], 10);
    }

    for (let n = 0; n < arrOuShu.length; n += 1) {
    sumOuShu += parseInt(arrOuShu[n], 10);
    }

    for (let p = 0; p < jishuChild1.length; p += 1) {
    sumJiShuChild1 += parseInt(jishuChild1[p], 10);
    sumJiShuChild2 += parseInt(jishuChild2[p], 10);
    }
    sumTotal = parseInt(sumJiShu, 10) + parseInt(sumOuShu, 10)
    + parseInt(sumJiShuChild1, 10) + parseInt(sumJiShuChild2, 10);
    const k = parseInt(sumTotal, 10) % 10 === 0 ? 10 : parseInt(sumTotal, 10) % 10;
    const luhn = 10 - k;
    if (lastNum === luhn) {
    return true;
    } else {
    return false;
    }
    }
     
    2、身份证号校验
    export function IdCardValidate(idCard) {
    const idCards = trim(idCard.replace(/ /g, ''));
    if (idCard.length === 15) {
    return isValidityBrithBy15IdCard(idCards);
    } else if (idCards.length === 18) {
    const idCardS = idCards.split(''); // 得到身份证数组
    if (isValidityBrithBy18IdCard(idCards) && isTrueValidateCodeBy18IdCard(idCardS)) {
    return true;
    } else {
    return false;
    }
    } else {
    return false;
    }

    function isTrueValidateCodeBy18IdCard(aIdCard) {
    const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
    const ValideCode = ['1', '0', '10', '9', '8', '7', '6', '5', '4', '3', '2'];
    let sum = 0;
    const AidCard = aIdCard;
    if (AidCard[17].toLowerCase() === 'x') {
    AidCard[17] = '10';
    }
    for (let i = 0; i < 17; i += 1) {
    sum += Wi[i] * AidCard[i];
    }
    const valCodePosition = sum % 11;
    if (AidCard[17] === ValideCode[valCodePosition]) {
    return true;
    } else {
    return false;
    }
    }

    function isValidityBrithBy18IdCard(idCard18) {
    const year = idCard18.substring(6, 10);
    const month = idCard18.substring(10, 12);
    const day = idCard18.substring(12, 14);
    const tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day));
    // 这里用getFullYear()获取年份,避免千年虫问题
    if (tempDate.getFullYear()
    !== parseFloat(year)
    || tempDate.getMonth()
    !== parseFloat(month) - 1
    || tempDate.getDate()
    !== parseFloat(day)) {
    return false;
    } else {
    return true;
    }
    }

    function isValidityBrithBy15IdCard(idCard15) {
    const year = idCard15.substring(6, 8);
    const month = idCard15.substring(8, 10);
    const day = idCard15.substring(10, 12);
    const tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day));
    if (tempDate.getYear()
    !== parseFloat(year) ||
    tempDate.getMonth()
    !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) {
    return false;
    } else {
    return true;
    }
    }
    function trim(str) {
    return str.replace(/(^s*)|(s*$)/g, '');
    }
    }
  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/ckf1988/p/9871793.html
Copyright © 2011-2022 走看看