`

C#实现的18位身份证号码最新算法[验证部分]

阅读更多

private void btnVerification_Click(object sender, EventArgs e)
{
Regex reg = new Regex(@"^\d{17}(\d|X)");
string sTemp=tbVerification.Text;
lbCardInfo.Items.Clear();
if (sTemp == string.Empty)
{
MessageBox.Show("没有输入任何身份证号码","请注意",MessageBoxButtons.OK,MessageBoxIcon.Warning);
return;
}
if (sTemp.Length != 18)
{
MessageBox.Show("输入身份证号码的长度应为18位", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (reg.Matches(sTemp).Count==0)
{
MessageBox.Show("输入身份证号码的格式有误", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

if (!isDiscValid(sTemp.Substring(0,6)))
{
MessageBox.Show("输入的身份证号码行政区划代码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

if (!isBirthValid(sTemp.Substring(6, 8)))
{
MessageBox.Show("输入的身份证号码出生日期无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
else
lbCardInfo.Items.Add(string.Format("出生日期:{0}年{1}月{2}日", sTemp.Substring(6, 4), sTemp.Substring(10, 2), sTemp.Substring(12, 2)));

if (!isSexValid(sTemp.Substring(14, 3)))
{
MessageBox.Show("输入的身份证号码性别顺序码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
else
{
lbCardInfo.Items.Add("性别:"+((Convert.ToInt32(sTemp.Substring(14, 3)) % 2==0) ? "女" : "男"));
}

if (!isParityValid(sTemp))
{
MessageBox.Show("输入的身份证号码验证码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
lbCardInfo.Items.Insert(0, "身份证号:" + sTemp);
lbCardInfo.Items.Insert(0, "验证解读信息:");
lbCardInfo.Items.Add("完成验证!");
gbCardInfo.Visible = true;
}

#region
private void GetDiscInfo(string sFilenName)
{
if (File.Exists(sFilenName))
{
using (StreamReader sr = new StreamReader(Environment.CurrentDirectory + @"\" + sFilenName, Encoding.Default))
{
string sLine = string.Empty;
Regex re = new Regex(@"[\s]{1,}", RegexOptions.Compiled);
while (!sr.EndOfStream)
{
sLine = sr.ReadLine();
sLine = re.Replace(sLine, " ");
string[] sTemp = sLine.Split(new char[] { ' ' });

if (sTemp[0].EndsWith("0000"))
{
provinceCode.Add(new clsAdministrativeDivisionsCode(sTemp[0], sTemp[1]));
}
else
{
if (sTemp[0].EndsWith("00"))
cityCode.Add(new clsAdministrativeDivisionsCode(sTemp[0], sTemp[1]));
else
if (sTemp[1].EndsWith("市辖区"))
cityCode.Add(new clsAdministrativeDivisionsCode(sTemp[0], " " + sTemp[1]));
else
cityCode.Add(new clsAdministrativeDivisionsCode(sTemp[0], " " + sTemp[1]));
}
}
}
}
else
{
MessageBox.Show("文件{0}不存在!", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}

private List<clsAdministrativeDivisionsCode> GetSomeCodes(string sCondition)
{
List<clsAdministrativeDivisionsCode> tempCity = new List<clsAdministrativeDivisionsCode>();
foreach (clsAdministrativeDivisionsCode temp in cityCode)
if (sCondition == temp.AdCode.Substring(0, 2))
tempCity.Add(temp);
return tempCity;
}

private string GenParityBit(string s17)
{
int[] Weight = new int[] { 7, 9 ,10, 5 ,8, 4, 2 ,1, 6 ,3, 7, 9, 10, 5, 8 ,4, 2};
string Parity = "10X98765432";
int s = 0;
for (int i = 0; i < s17.Length; i++)
{
s += Int32.Parse(s17[i].ToString())*Weight[i];
}
return Parity[s % 11].ToString();
}

//iSex=0 男
private List<string> GenRnd(int iSex)
{
Random rd=new Random();
List<string> sTemp = new List<string>();
int i=0;
while(i<maxNum)
{
int rndNum = rd.Next(0,1000);
if(rndNum % 2 == iSex)rndNum++;
if (rndNum >= 1000) continue;
string s3=rndNum.ToString().PadLeft(3,'0');
if(!sTemp.Contains(s3))
{
sTemp.Add(s3);
i++;
}
}
return sTemp;
}

private List<string> GetID()
{
List<string> tempID = new List<string>();
List<string> sexRndNum = GenRnd(rbMan.Checked?0:1);
string str18 = string.Empty;
for (int i = 0; i < maxNum; i++)
{
string str17=string.Empty;
string sCity = cbCities.SelectedValue.ToString();
string sYMD=dtpBirth.Value.Year.ToString() + dtpBirth.Value.Month.ToString().PadLeft(2, '0') + dtpBirth.Value.Day.ToString().PadLeft(2, '0');
str17=sCity+sYMD+sexRndNum[i];
str18 = str17 + GenParityBit(str17);
tempID.Add(str18);
}
return tempID;
}

private bool isDiscValid(string s)
{
bool iFlag = false;
foreach (clsAdministrativeDivisionsCode cadc in cityCode)
{
if (cadc.AdCode == s)
{
string st = s.Substring(0, 2);
foreach (clsAdministrativeDivisionsCode capc in provinceCode)
{
if (capc.AdCode.Substring(0, 2) == st)
{
lbCardInfo.Items.Add("省或直辖市名称:" + capc.AdName);
break;
}
}

foreach (clsAdministrativeDivisionsCode caac in cityCode)
{
if (caac.AdCode == s.Substring(0, 4) + "00")
{

lbCardInfo.Items.Add("市名称:" + caac.AdName.TrimStart());
break;
}
}

lbCardInfo.Items.Add("地区名称:" + cadc.AdName.TrimStart());
iFlag = true;
break;
}
}
return iFlag;
}

private bool isBirthValid(string s)
{
string sYear = s.Substring(0, 4);
string sMonth = s.Substring(4, 2);
string sDay = s.Substring(6, 2);
DateTime dt;
if (DateTime.TryParse(string.Format("{0}-{1}-{2}", sYear, sMonth, sDay), out dt))
{
if (dt > DateTime.Now)
return false;
else
return true;
}
else
return false;

}

private bool isSexValid(string s)
{
return s == "000" ? false : true;
}

private bool isParityValid(string s18)
{
int[] Weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
string Parity = "10X98765432";
string s17 = s18.Substring(0, 17);
int s = 0;
for (int i = 0; i < s17.Length; i++)
{
s += Int32.Parse(s17[i].ToString()) * Weight[i];
}
return Parity[s % 11].ToString() == s18.Substring(17, 1) ? true : false;
}

#endregion

界面演示如下:

ID INTERFACE

这里是主要的验证部分,如有需要全部源代码的,请在评论中留下你的E-MAIL。

分享到:
评论

相关推荐

    身份证号码验证示例源码2008-4-22

    身份证号码验证示例源码 &lt;br&gt;中国身份证号码验证,支持15,18位,可验证成功90%的身份证号 利用正则进行身份证算法验证 &lt;br&gt;非常不错

    C# 源码 判断 身份证号 有效性

    C# 源码 判断 身份证号 有效性 包含:长度 校验位 出生日期 省份 等判断算法

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例142 身份证号从15位升到18位的算法 186 实例143 歌德巴赫猜想的算法实现 187 实例144 八皇后问题的算法实现 188 实例145 百钱百鸡的算法实现 190 实例146 韩信点兵的算法实现 191 实例147 实现斐波纳契数列求和 ...

    C#编程经验技巧宝典

    58 &lt;br&gt;0081 文本中首字母改为大写 59 &lt;br&gt;0082 C#随机数的产生 59 &lt;br&gt;0083 身份证从15位升至18位算法 60 &lt;br&gt;0084 十进制数转二进制数的算法 60 &lt;br&gt;0085 十进制数转八进制数的算法 61...

    C#程序开发范例宝典(第2版).part02

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    C#程序开发范例宝典(第2版).part08

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS代码: /...

    C#程序开发范例宝典(第2版).part12

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    C#程序开发范例宝典(第2版).part13

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

Global site tag (gtag.js) - Google Analytics