關於驗證中國公民身份証號碼

由於中國公民的身份証號碼是由18位數字(最後一位可能是X,代表10)組成,人們在輸入自己的身份證號碼容易出錯。所以,作爲開發者應該按照算法進行校驗,可以將輸錯身份證號碼的幾率降低到千萬分之一 不可能完全確保準確

以下是檢驗算法(javascript):

//code:身份証號碼
function VerifyIdNumber(code){
	//debugger
	if(code.length!=18){
		return false;
	}
	var rex=/^\d{17}[0-9xX]{1}$/;
	if(rex.test(code)==false){
		return false;
	}
	var factor=[];//Wi
	for(var i=0;i<18;i++){
		factor.push(Math.pow(2,i)%11);
	}
	var codeArray=[];
	codeArray = code.split("").reverse();
	var numberArray=[];//Ai
	for(var i=0;i<codeArray.length;i++){
		if(codeArray[i].toLowerCase()=="x"){
			numberArray.push(10);
		}else{
			numberArray.push(Number(codeArray[i]));
		}
	}
	var sums=0;//和
	for(var i=0;i<numberArray.length;i++){
		sums+=numberArray[i]*factor[i];
	}
	return sums%11==1;
}

C#版本:

        /// <summary>
        /// 验证身份证是否正确合理
        /// Author:Lui
        /// </summary>
        /// <param name="cardNumber">身份证号</param>
        /// <returns></returns>
        public static bool ValidIdCard(this string cardNumber)
        {
            if (cardNumber.Length != 18)
            {
                return false;
            }
            var rex = "^\\d{17}[0-9xX]{1}$";
            if (Regex.IsMatch(cardNumber, rex) == false)
            {
                return false;
            }
            var factor = new double[18];//Wi
            for (var i = 0; i < 18; i++)
            {
                factor[i] = (Math.Pow(2, i) % 11);
            }
            char[] codeArray = cardNumber.Reverse().ToArray();
            int[] numberArray = new int[18];//Ai
            for (var i = 0; i < codeArray.Length; i++)
            {
                if (codeArray[i].ToString().ToLower() == "x")
                {
                    numberArray[i] = (10);
                }
                else
                {
                    numberArray[i] = (int.Parse(codeArray[i].ToString()));
                }
            }
            var sum = 0d;//和
            for (var i = 0; i < numberArray.Length; i++)
            {
                sum += numberArray[i] * factor[i];
            }
            return sum % 11 == 1;
        }