js內地身份證號碼算法

/** 
* 身份證15位編碼規則:dddddd yymmdd xx p  
* dddddd:地區碼  
* yymmdd: 出生年月日  
* xx: 順序類編碼,無法確定  
* p: 性別,奇數爲男,偶數爲女 
* <p /> 
* 身份證18位編碼規則:dddddd yyyymmdd xxx y  
* dddddd:地區碼  
* yyyymmdd: 出生年月日  
* xxx:順序類編碼,無法確定,奇數爲男,偶數爲女  
* y: 校驗碼,該位數值可通過前17位計算獲得 
* <p /> 
* 18位號碼加權因子爲(從右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ] 
* 驗證位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]  
* 校驗位計算公式:Y_P = mod( ∑(Ai×Wi),11 )  
* i爲身份證號碼從右往左數的 2...18 位; Y_P爲腳丫校驗碼所在校驗碼數組位置 
*  
*/ 
 
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);  
    } else if (idCard.length == 18) {  
        var a_idCard = idCard.split("");// 得到身份證數組  
        if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){  
            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;  
    }  
}  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章