using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace LiveForum.Code.Utility { /// /// 其它扩展类 /// public static class OtherExtensions { /// /// 验证身份证号是否正确 /// /// /// public static bool ValidateIDCard(string idNumber) { if (string.IsNullOrEmpty(idNumber)) { return false; } // 验证长度 if (idNumber.Length != 18) { return false; } // 验证格式 Regex regex = new Regex(@"^\d{17}(\d|X)$"); if (!regex.IsMatch(idNumber)) { return false; } // 验证校验码 return ValidateCheckDigit(idNumber); } /// /// 验证校验码 /// /// /// private static bool ValidateCheckDigit(string idNumber) { // 加权因子 int[] weights = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 校验码 char[] checkDigits = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; int sum = 0; for (int i = 0; i < 17; i++) { sum += (idNumber[i] - '0') * weights[i]; } int mod = sum % 11; return idNumber[17] == checkDigits[mod]; } /// /// 根据身份证号计算年龄、性别、生日 /// /// 身份证号 /// public static (bool verify, int age, string sex, string birthday) GetIDCardBirthdayAgeSex(string identityCard) { var birthday = ""; var age = 0; var sex = ""; if (string.IsNullOrEmpty(identityCard)) { return (false, 0, "", ""); } else { if (identityCard.Length != 15 && identityCard.Length != 18)//身份证号码只能为15位或18位其它不合法 { return (false, 0, "", ""); } } birthday = ""; string strSex = string.Empty; if (identityCard.Length == 18)//处理18位的身份证号码从号码中得到生日和性别代码 { birthday = identityCard.Substring(6, 4) + "-" + identityCard.Substring(10, 2) + "-" + identityCard.Substring(12, 2); strSex = identityCard.Substring(14, 3); } if (identityCard.Length == 15) { birthday = "19" + identityCard.Substring(6, 2) + "-" + identityCard.Substring(8, 2) + "-" + identityCard.Substring(10, 2); strSex = identityCard.Substring(12, 3); } age = CalculateAge(birthday);//根据生日计算年龄 if (int.Parse(strSex) % 2 == 0)//性别代码为偶数是女性奇数为男性 { sex = "女"; } else { sex = "男"; } return (true, age, sex, birthday); } /// /// 根据出生日期,计算精确的年龄 /// /// 生日 /// public static int CalculateAge(string birthDay) { DateTime birthDate = DateTime.Parse(birthDay); DateTime nowDateTime = DateTime.Now; int age = nowDateTime.Year - birthDate.Year; //再考虑月、天的因素 if (nowDateTime.Month < birthDate.Month || (nowDateTime.Month == birthDate.Month && nowDateTime.Day < birthDate.Day)) { age--; } return age; } } }