身份证号码有效性检测算法 ( js版 转 .net版 )

  1         #region 检测是否是正确的身份证

  2         /// <summary>

  3         /// 身份证验证

  4         /// </summary>

  5         /// <param name="num"></param>

  6         /// <returns></returns>

  7         public static bool isIdCardNo(string cardid)

  8         {

  9             string num = cardid.ToUpper();

 10             int[] factorArr = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };

 11             char[] parityBit = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

 12             char[] varArray = new char[18];

 13             var lngProduct = 0;

 14             int intCheckDigit = 0;

 15             var intStrLen = num.Length;

 16             var idNumber = num;

 17             // initialize

 18             if ((intStrLen != 15) && (intStrLen != 18))

 19             {

 20                 return false;

 21             }

 22             // check and set value

 23 

 24             for (int i = 0; i < intStrLen; i++)

 25             {

 26                 varArray[i] = (char)Convert.ToInt32(idNumber[i]);

 27                 if (((varArray[i] - 48) < 0 || (varArray[i] - 48) > 9) && (i != 17))

 28                 {

 29                     return false;

 30                 }

 31                 else if (i < 17)

 32                 {

 33                     varArray[i] = (char)((varArray[i] - 48) * factorArr[i]);

 34                 }

 35             }

 36             if (intStrLen == 18)

 37             {

 38                 //check date

 39                 var date8 = idNumber.Substring(6, 8);

 40                 if (isDate8(date8) == false)

 41                 {

 42                     return false;

 43                 }

 44                 // calculate the sum of the products

 45                 for (int i = 0; i < 17; i++)

 46                 {

 47                     lngProduct = lngProduct + varArray[i];

 48                 }

 49                 // calculate the check digit

 50                 intCheckDigit = parityBit[lngProduct % 11];

 51                 // check last digit

 52                 if (varArray[17] != intCheckDigit)

 53                 {

 54                     return false;

 55                 }

 56             }

 57             else

 58             {        //length is 15

 59                 //check date

 60                 var date6 = idNumber.Substring(6, 6);

 61                 if (isDate6(date6) == false)

 62                 {

 63                     return false;

 64                 }

 65             }

 66             return true;

 67         }

 68 

 69         /// <summary>

 70         /// 15位身份证日期检测--年/月--6位

 71         /// </summary>

 72         /// <param name="sDate"></param>

 73         /// <returns></returns>

 74         static bool isDate6(string sDate)

 75         {

 76             if (!Regex.IsMatch(sDate, "^[0-9]{6}$"))

 77             {

 78                 return false;

 79             }

 80             int year, month;

 81             year = Convert.ToInt32(sDate.Substring(0, 4));

 82             month = Convert.ToInt32(sDate.Substring(4, 2));

 83             if (year < 1700 || year > 2500) return false;

 84             if (month < 1 || month > 12) return false;

 85             return true;

 86         }

 87 

 88         /// <summary>

 89         /// 18位身份证日期检测--年/月/日--8位

 90         /// </summary>

 91         /// <param name="sDate"></param>

 92         /// <returns></returns>

 93         static bool isDate8(string sDate)

 94         {

 95             if (!Regex.IsMatch(sDate, "^[0-9]{8}$"))

 96             {

 97                 return false;

 98             }

 99             int year, month, day;

100             year = Convert.ToInt32(sDate.Substring(0, 4));

101             month = Convert.ToInt32(sDate.Substring(4, 2));

102             day = Convert.ToInt32(sDate.Substring(6, 2));

103             int[] iaMonthDays = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

104             if (year < 1700 || year > 2500) return false;

105             if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;

106             if (month < 1 || month > 12) return false;

107             if (day < 1 || day > iaMonthDays[month - 1]) return false;

108             return true;

109         }

110         #endregion

 

你可能感兴趣的:(.net)