您的位置:首页 > 编程语言 > C#

使用C#实现身份证号码15位到18位的转换

2010-03-17 09:22 1376 查看
完整文章和代码下载:http://www.dingos.cn/index.php?topic=958.0

程序初始界面:



输入15为身份证号码,点击“转换”按钮后,进行验证:

没有输入身份证号码:



输入的不是15位:



身份证号码中包含非数字:



正确的身份证转换为18位身份证,并显示出生日期和性别:



点击“重新输入”去空文本框等



转换算法:

在6位行政区划后插入2为世纪代码(如19),构成四位出生年份,得到17位号码;

把17位号码从高位到底位与下拉17个数字分别相乘求和(N):
[2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7]
比如身份证号码为:C1C2C3...C17,则N = C17 × 2 + C16 × 4 + ... + C1 × 7

将N除以11取余数R,根据余数计算尾数T:

如果R = 0,则T = 1;如果R = 1,则T = 0;如果R = 2,则T = X;

如果R = 3,则T = 9;如果R = 4,则T = 8;依此类推……;如果R = 10,则T = 2;

将尾数T添加到17为号码后既得到18为号码。

根据身份证号的第7-14位(YYYYMMDD),显示出生日期;

根据身份证号的第17位(奇数为男性,偶数为女性),显示性别;

【分析】
★ 定义字符串strCardID用于接收文本框输入的信息;
★ 定义一个字符数组oldCardID用于保存15位的原始身份证;
★ 并定义一个字符数组newCardID用于保存转换后的18位的身份证;
★ 将oldCardID的第0位到5位之间保存到newCardID的第0位到5位;
★ newCardID第6位和第7为分别是“1”和“9”;
★ 将oldCardID第6到14保存到newCardID的第8位到第16位;
★ 根据公式“N = C17 × 2 + C16 × 4 + ... + C1 × 7”求出newCardID的第17为;
★ 将字符数组newCardID转换成字符串,并显示;
★ 同时将生日、性别显示

【转换事件处理】
1. 判断输入是否输入身份证

if(strCardID == "") {
lblShowMessage.Text = "您没有输入身份证号码,请正确输入";
return;
}

2. 判断输入的身份证长度是否等于15位
if(strCardID.Length != 15) {
lblShowMessage.Text = "您输入的身份证号码的位数为" + txtCardID.Text.Length + ",请重新输入";
return;
}

3. 判断输入的15位身份证的每一都是整型
可以将15位字符串转换为长整型数据,如果不出现异常则每一位都是整型,否则就包含非整型字符
try {
iCardID = long.Parse(strCardID);
} catch {
lblShowMessage.Text = "您输入的身份证号码包含非数字,请重新输入";
}


4. 将15位身份证字符串保存到15位字符数组oldCardID中
定义一个18为的字符数组newCardID用于保存新身份证号码
将oldCardID的第0位到第5位保存到newCardID的第第0位到第5位中
为newCardID的第6位和第7位分别赋值为'1'和'9'
将oldCardID的第6为到第14为保存到newCardID的第8位到第16位中

char[] oldCardID = strCardID.ToCharArray();
char[] newCardID = new char[18];
for(int i = 0; i < 6; i++) {
newCardID[i] = oldCardID[i];
}
newCardID[6] = '1';
newCardID[7] = '9';
for(int i = 6; i < oldCardID.Length; i++) {
newCardID[i + 2] = oldCardID[i];
}

5. 定义一个整型数组quan用于保存权值
定义一个整型变量N用于求新身份证的第0位到第16位和权值乘积的和
根据N对11取模得到的值得到新身份证的第17位
int N = 0;
int[] quan = new int[] { 2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7 };
for(int i = 0; i < quan.Length; i++) {
N = N + quan[i] * (newCardID[quan.Length - i - 1] - 48);
}
N %= 11;
switch(N) {
case 0:
newCardID[17] = '1';
break;
case 1:
newCardID[17] = '0';
break;
case 2:
newCardID[17] = 'X';
break;
case 3:
newCardID[17] = '9';
break;
case 4:
newCardID[17] = '8';
break;
case 5:
newCardID[17] = '7';
break;
case 6:
newCardID[17] = '6';
break;
case 7:
newCardID[17] = '5';
break;
case 8:
newCardID[17] = '4';
break;
case 9:
newCardID[17] = '3';
break;
case 10:
newCardID[17] = '2';
break;
}

6. 将新身份证的字符数组中的内容显示
foreach(char ch in newCardID) {
lblCardIDNew.Text += ch;
}


7. 显示生日日期
在新身份证数组中的6位到第9为是出生年;第10和11位为出生月;第12和13位为出生日

for(int i = 6; i < 10; i++) {
lblShowBirthday.Text += newCardID[i];
}
lblShowBirthday.Text += "年";
for(int i = 10; i < 12; i++) {
lblShowBirthday.Text += newCardID[i];
}
lblShowBirthday.Text += "月";
for(int i = 12; i < 14; i++) {
lblShowBirthday.Text += newCardID[i];
}
lblShowBirthday.Text += "日";

8. 显示性别
新身份证数组的第16位为奇数表示性别为“男”,为偶数表示性别为“女”
if((newCardID[16] % 2) == 0)
lblShowSex.Text = "女";
else
lblShowSex.Text = "男";


【实现重输按钮事件】
重置清除文本框中的内容、标签等内容

txtCardID.Text = "";
lblCardIDNew.Text = "";
lblShowBirthday.Text = "";
lblShowSex.Text = "";
lblShowMessage.Text = "请重新输入";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: