C# 身份证信息验证
#region 身份证验证
/// <summary>
/// 验证身份证信息
/// </summary>
/// <param name="ACidCode"></param>
/// <returns></returns>
public static bool CheckCidInfo(string ACidCode)
{
if (string.IsNullOrEmpty(ACidCode)) return false; // 空
for (int i = 0; i < 17; i++)
if ("0123456789".IndexOf(ACidCode[i]) < 0) return false; // 前17位必须数字
if ("0123456789Xx".IndexOf(ACidCode[17]) < 0) return false; // 最后一位必须数字或X
int vProvince = int.Parse(ACidCode.Substring(0, 2));
if (vProvince > PROVINCE_CODE.Length ||
string.IsNullOrEmpty(PROVINCE_CODE[vProvince])) return false; // 地址码错误
DateTime vBirthday;
if (!DateTime.TryParseExact(ACidCode.Substring(6, 8), "yyyyMMdd", null,
System.Globalization.DateTimeStyles.None, out vBirthday)) return false; // 日期格式错误
if (vBirthday > DateTime.Now) return false; // 未来的人???
if (vBirthday < new DateTime(1900, 10, 01)) return false; // 还没建国
int T = 0;
for (int i = 0; i < 18; i++)
{
int j = "xX".IndexOf(ACidCode[i]) < 0 ? ACidCode[i] - '0' : 10;
T += (int)Math.Pow(2, 17 - i) % 11 * j;
}
if (T % 11 != 1) return false; // 验证码错误
return true;
}
/// <summary>
/// 身份证区域码
/// </summary>
/// <param name="strTel"></param>
/// <returns></returns>
public static string[] PROVINCE_CODE = {
null, null, null, null, null, null, null, null, null, null, null,
"北京", "天津", "河北", "山西", "内蒙古", null, null, null, null, null,
"辽宁", "吉林", "黑龙江", null, null, null, null, null, null, null,
"上海", "江苏", "浙江", "安微", "福建", "江西", "山东", null, null, null,
"河南", "湖北", "湖南", "广东", "广西", "海南", null, null, null,
"重庆", "四川", "贵州", "云南", "西藏", null, null, null, null, null, null,
"陕西", "甘肃", "青海", "宁夏", "新疆", null, null, null, null, null,
"台湾", null, null, null, null, null, null, null, null, null,
"香港", "澳门", null, null, null, null, null, null, null, null,
"国外"};
#endregion
/// <summary>
/// 验证身份证信息
/// </summary>
/// <param name="ACidCode"></param>
/// <returns></returns>
public static bool CheckCidInfo(string ACidCode)
{
if (string.IsNullOrEmpty(ACidCode)) return false; // 空
for (int i = 0; i < 17; i++)
if ("0123456789".IndexOf(ACidCode[i]) < 0) return false; // 前17位必须数字
if ("0123456789Xx".IndexOf(ACidCode[17]) < 0) return false; // 最后一位必须数字或X
int vProvince = int.Parse(ACidCode.Substring(0, 2));
if (vProvince > PROVINCE_CODE.Length ||
string.IsNullOrEmpty(PROVINCE_CODE[vProvince])) return false; // 地址码错误
DateTime vBirthday;
if (!DateTime.TryParseExact(ACidCode.Substring(6, 8), "yyyyMMdd", null,
System.Globalization.DateTimeStyles.None, out vBirthday)) return false; // 日期格式错误
if (vBirthday > DateTime.Now) return false; // 未来的人???
if (vBirthday < new DateTime(1900, 10, 01)) return false; // 还没建国
int T = 0;
for (int i = 0; i < 18; i++)
{
int j = "xX".IndexOf(ACidCode[i]) < 0 ? ACidCode[i] - '0' : 10;
T += (int)Math.Pow(2, 17 - i) % 11 * j;
}
if (T % 11 != 1) return false; // 验证码错误
return true;
}
/// <summary>
/// 身份证区域码
/// </summary>
/// <param name="strTel"></param>
/// <returns></returns>
public static string[] PROVINCE_CODE = {
null, null, null, null, null, null, null, null, null, null, null,
"北京", "天津", "河北", "山西", "内蒙古", null, null, null, null, null,
"辽宁", "吉林", "黑龙江", null, null, null, null, null, null, null,
"上海", "江苏", "浙江", "安微", "福建", "江西", "山东", null, null, null,
"河南", "湖北", "湖南", "广东", "广西", "海南", null, null, null,
"重庆", "四川", "贵州", "云南", "西藏", null, null, null, null, null, null,
"陕西", "甘肃", "青海", "宁夏", "新疆", null, null, null, null, null,
"台湾", null, null, null, null, null, null, null, null, null,
"香港", "澳门", null, null, null, null, null, null, null, null,
"国外"};
#endregion