以下程序是整合了網上的一些通常的算法編寫的。
using System;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
namespace UserLib.World.Person
{
/// <summary>
/// 身份證類
/// </summary>
public class IDCard
{
/// <summary>
/// 省市自治區數組
/// </summary>
private static string[] city=
{
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,
"國外"
};
/// <summary>
/// 取得校驗碼
/// </summary>
/// <param name="cid">身份證號碼</param>
/// <returns>校驗碼</returns>
private static string GetCheckCode(string cid)
{
string[] check = {"1","0","X","9","8","7","6","5","4","3","2"};
int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};
int rs = 0;
for (int i=0;i<=cid.Length-1;i++ )
{
rs += int.Parse(cid.Substring(i,1)) * weight[i];
}
rs = rs % 11;
return check[rs];
}
/// <summary>
/// 身份證位轉位
/// </summary>
/// <param name="cid">15位身份證號碼</param>
/// <returns>18位身份證號碼</returns>
public static string CID15To18(string cid)
{
string rs=cid.Substring(0,6) + "19" +cid.Substring(6);
rs+=GetCheckCode(cid);
return rs;
}
/// <summary>
/// 身份證的校驗
/// </summary>
/// <param name="cid">身份證號碼</param>
/// <returns>是否通過校驗</returns>
public static bool Validate(string cid)
{
ArrayList msg;
bool rs=Validate(cid,out msg);
return rs;
}
/// <summary>
/// 身份證的校驗
/// </summary>
/// <param name="cid">身份證號碼</param>
/// <param name="msg">校驗失敗信息</param>
/// <returns>是否通過校驗</returns>
public static bool Validate(string cid,out ArrayList msg)
{
msg=new ArrayList();
//判斷格式正確性
System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^/d{17}(/d|x)$");
System.Text.RegularExpressions.Match mc = rg.Match(cid);
if(!mc.Success)
{
msg.Add("格式非法");
}
//判斷地區正確性
if(city[int.Parse(cid.Substring(0,2))]==null)
{
msg.Add("地區非法");
}
//判斷出生日期正確性
try
{
DateTime.Parse(cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2));
}
catch
{
msg.Add("出生日期非法");
}
//判斷校驗碼正確性
if (cid.Substring(17,1)!=GetCheckCode(cid))
{
msg.Add("校驗碼非法");
}
if (msg.Count==0)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 取得身份證信息
/// </summary>
/// <param name="cid">身份證號碼</param>
/// <param name="province">省份</param>
/// <param name="birDate">出生年月</param>
/// <param name="sex">性別</param>
/// <returns>是否爲有效的身份證號碼</returns>
public static bool GetInfo(string cid,out string province,out DateTime birDate,out string sex)
{
province="";
birDate=DateTime.Parse("2000-01-01");
sex="";
if (Validate(cid))
{
province=city[int.Parse(cid.Substring(0,2))];
birDate=DateTime.Parse(cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2));
sex=int.Parse(cid.Substring(16,1))%2==1?"男":"女";
return true;
}
else
{
return false;
}
}
}
}