欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > C# >内容正文

C#

C# 身份证号码15位和18位验证

发布时间:2024/3/24 C# 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C# 身份证号码15位和18位验证 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
/// <summary> /// 身份证 /// </summary> [Serializable] public class IDCard {/// <summary>/// 身份证号/// </summary>public string IDCardNum { get; set; }/// <summary>/// 行政区/// </summary>public string Canton { get; private set; }/// <summary>/// 出生日期/// </summary>public DateTime Birthday { get; private set; }/// <summary>/// 性别(0-女;1-男)/// </summary>public int Gander { get; private set; }/// <summary>/// 是否为合法身份证号/// </summary>public bool IsIDCard { get; private set; }public IDCard() { }public IDCard(string IDnumber){this.IDCardNum = IDnumber;}/// <summary>/// /// </summary>/// <param name="number"></param>/// <returns></returns>public static IDCard Parse(string number){IDCard idCard = new IDCard(number);const int s5bits = 15;const int s8bits = 18;#region 15位if (number.Length == s5bits)  //15位的处理{//检查输入是否为数字for (int i = 0; i < number.Length; i++){if ((number[i] < '0') || (number[i] > '9')){throw new FormatException("身份证号错误");}}//出生日期string birthday = "19" + number.Substring(6, 6);string year = birthday.Substring(0, 4);string month = birthday.Substring(4, 2);string day = birthday.Substring(6, 2);birthday = string.Format("{0}-{1}-{2}", year, month, day);DateTime date = new DateTime();if (DateTime.TryParse(birthday, out date)){idCard.Birthday = date;}else{throw new InvalidCastException("身份证号出生日期错误");}//性别if ((number[s5bits - 1] == '0') || (number[s5bits - 1] % 2 == 0)){idCard.Gander = 0; // 女}else{idCard.Gander = 1; // 男}idCard.IsIDCard = true;return idCard;}#endregion#region 18位else if (number.Length == s8bits)  //18位的处理{// 检查前17位是否为数字for (int i = 0; i < number.Length -1; i++){if ((number[i] < '0') || (number[i] > '9')){throw new FormatException("身份证号错误");}}char end = number[s8bits - 1];  //最后一位//最后1位是x转成大写Xif (end == 'x'){end = 'X';number = number.Substring(0, s8bits - 1) + end;}if (!(end == 'X' || (end >= '0' && end <= '9'))){throw new FormatException("身份证号错误");}/// 校验int num = 0;char proof;for (int i = 17; i > 0; i--){num = num + (int)(Math.Pow(2, i) % 11) * (number[17 - i] - 48);}num %= 11;switch (num){case 0:proof = '1';break;case 1:proof = '0';break;case 2:proof = 'X';break;default:proof = (char)(12 - num + 48);break;}if (end != proof)  //最后一位与校验码不符{throw new FormatException("身份证号错误");}//出生日期string birthday = number.Substring(6, 8);string year = birthday.Substring(0, 4);string month = birthday.Substring(4, 2);string day = birthday.Substring(6, 2);birthday = string.Format("{0}-{1}-{2}", year, month, day);DateTime date = new DateTime();if (DateTime.TryParse(birthday, out date)){idCard.Birthday = date;}else{throw new InvalidCastException("身份证号出生日期错误");}//行政区idCard.Canton = number.Substring(0, 6);//性别if ((number[16] == '0') || (number[16] % 2 == 0)){idCard.Gander = 0;  //女}else{idCard.Gander = 1;  //男}idCard.IsIDCard = true;return idCard;}#endregionelse{throw new FormatException("无效的身份证号码位数:" + number.Length);}}public static bool TryParse(string number, out IDCard card){IDCard idCard = null;bool isIdCard = true;try{Parse(number);}catch (Exception){isIdCard = false;}card = idCard;return isIdCard;} }

转载于:https://www.cnblogs.com/fanying/p/10919038.html

总结

以上是生活随笔为你收集整理的C# 身份证号码15位和18位验证的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。