星期四, 8月 11, 2011

轉型第一發...身份證號碼驗證程式碼

很久以前有用DELPHI寫過一樣的東西,這次是改用C#重寫一次...
反正BLOG開了也是開了...就拿來放一些程式上的小片段吧

/// 

/// 檢查身分證字號是否正確
/// 回傳值:0:正確 1:首碼不符 2:姓別碼不符 3.驗證碼驗證錯誤 4.字串長度不正確
///
/// "IDNo">要檢查的身分證號碼
public int CheckIDNo(string IDNo)
{
int HeadNo = 0, vPlus = 0, vBodyNo = 0, vResultNo = 0, vResult = 0, vStrLength = 0;
vStrLength = IDNo.Length;
if (vStrLength != 10)
{
vResult = 4; //輸入的字串長度不是10碼
}
else
{
string HeadStr = IDNo.Substring(0, 1).ToUpper();
string[] HeadCode = new string[26] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
int[] HeadNumber = new int[26] { 10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35, 23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33 };
for (int vCount = 0; vCount <= 25; vCount++)
{
vResult = 1; //先預設首碼檢查不正常
if (HeadStr == HeadCode[vCount])
{
HeadNo = ((HeadNumber[vCount] % 10) * 9 + (HeadNumber[vCount] / 10));
vResult = 0; //因為已經在陣列中找到對應的字串了,所以把回傳值設回0,表示通過首碼檢查
break;
}
}
HeadStr = IDNo.Substring(1, 1);
if ((HeadStr == "1") || (HeadStr == "2"))
{
for (int i = 1; i <= 8; i++)
{
vPlus = 9 - i;
vBodyNo += Convert.ToInt32(IDNo.Substring(i, 1)) * vPlus; //依不同位數計算並加總
}
vBodyNo = vBodyNo + HeadNo; //把首碼計算的結果跟碼身計算的結果加總
vResultNo = 10 - vBodyNo % 10; //計算驗證值
if (vResultNo == Convert.ToInt32(IDNo.Substring(9, 1)))
{
vResult = 0; //如果驗證值跟驗證碼相同時傳回 0
}
else
{
vResult = 3; //驗證不符
}
}
else
{
vResult = 2; //姓別碼不符,必須是 1(男)或 2(女)
}
}
return vResult;
} //End CheckIDNo

沒有留言: