C# 身份证号码15位和18位验证
生活随笔
收集整理的这篇文章主要介绍了
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位验证的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Webservice调用天气接口案例
- 下一篇: C#实现简单的双色球模拟器