/// <summary> /// 中国大陆身份证15位转18位 /// </summary> public static string ConvertChinaPRIDCard_15_18(string idCardNo) { if (!RegExpHelper.IsAllNumber(idCardNo, 15, 15)) { return(idCardNo); } var allCsNumber = new string[] { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" }; var allWiNumber = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; var tmpNewNumber = new StringBuilder(idCardNo); tmpNewNumber.Insert(6, "19"); var sum = 0; for (int i = 0; i < 17; i++) { sum += ConvertHelper.GetInt(tmpNewNumber[i].ToString()) * allWiNumber[i]; } sum %= 11; tmpNewNumber.Append(allCsNumber[sum]); return(tmpNewNumber.ToString()); }
/// <summary> /// 是否是有效的中国大陆身份证[严格校验] /// </summary> public static bool IsChinaPRIDCard(string idCardNo) { if (string.IsNullOrEmpty(idCardNo)) { return(false); } var tmpType = idCardNo.Length; var tmpIndex = idCardNo.Length - 1; var tmpValue = idCardNo.Remove(tmpIndex); if (!RegExpHelper.IsAllNumber(tmpValue, (uint)tmpIndex, (uint)tmpIndex) || ConvertHelper.GetLong(tmpValue, 0) < Math.Pow(10, tmpIndex - 1)) { return(false); } var provinceCodes = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91"; if (provinceCodes.IndexOf(idCardNo.Remove(2)) < 0) { return(false); } var interval = tmpType == 15 ? 2 : 0; var birthday = ConvertHelper.GetDateTime(idCardNo.Substring(6, 8 - interval).Insert(6 - interval, "-").Insert(4 - interval, "-")); if (birthday < InternalConstant.DefaultMSdbMinDate) { return(false); } if (tmpType == 15) { return(true); } // 继续18位校验 var allCsNumber = new string[] { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" }; var allWiNumber = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; var allAiNumber = ConvertHelper.Cast <int>(tmpValue.ToList().ConvertAll((item) => { return(item.ToString()); })).ToArray(); var sum = 0; for (int i = 0; i < tmpIndex; i++) { sum += allAiNumber[i] * allWiNumber[i]; } var mod = 0; Math.DivRem(sum, 11, out mod); if (allCsNumber[mod] != idCardNo.Substring(tmpIndex, 1).ToLower()) { return(false); } return(true); }