/* ---------------------------------------------------------- * 文件名称:IDCard.cs * 作者:秦建辉 * * QQ:36748897 * * 博客:http://www.firstsolver.com/wordpress/ * * 开发环境: * Visual Studio V2012 * .NET Framework 4.5 * * 版本历史: * V1.0 2013年06月20日 * 完成身份证号码校验 ------------------------------------------------------------ */ using System; namespace Splash.Util { public class IDCard { /// <summary> /// 验证身份证号码 /// </summary> /// <param name="IdCardNumber">要验证的身份证号码</param> /// <param name="Gender">性别 0:不校验 1:男性 2:女性</param> /// <returns> /// true:号码校验通过 /// false:号码校验失败 /// </returns> /// <remarks> /// 参考资料:http://baike.baidu.com/view/5112521.htm /// 身份证最后一位是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的 /// 第17位,奇数表示男性,偶数表示女性 /// </remarks> public static Boolean VerifyIdCardNumber(String IdCardNumber, Int32 Gender = 0) { const Int32 IdCardNumberLength = 18; // 身份证号码长度18位 if (String.IsNullOrEmpty(IdCardNumber) || IdCardNumber.Length != IdCardNumberLength) return false; try { // 检测月份 1~12 Int32 Month = Convert.ToInt32(IdCardNumber.Substring(10, 2)); if (Month < 1 || Month > 12) return false; // 检测日期 1~31 Int32 Day = Convert.ToInt32(IdCardNumber.Substring(12, 2)); if (Day < 1 || Day > 31) return false; // 判断性别 if (Gender == 1) { // 男性,奇数为男 if (Convert.ToInt32(IdCardNumber.Substring(16, 1)) % 2 == 0) return false; } else if (Gender == 2) { // 女性,偶数为女 if (Convert.ToInt32(IdCardNumber.Substring(16, 1)) % 2 != 0) return false; } } catch (Exception) { return false; } // 验证末位的校验码 Byte[] Weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; Int32 Sum = 0; for (Int32 i = 0; i < IdCardNumberLength - 1; i++) { Char ch = IdCardNumber[i]; if (!Char.IsDigit(ch)) return false; // 是否为数字字符 Sum += (ch - '0') * Weight[i]; } Int32 Remainder = Sum % 11; if (Remainder == 2) { if (Char.ToLower(IdCardNumber[IdCardNumberLength - 1]).Equals('x')) return true; else return false; } else { if (IdCardNumber[IdCardNumberLength - 1] - '0' == (12 - Remainder) % 11) return true; else return false; } } } }