http://blog.csdn.net/blestcc/article/details/2090716
國民身份證統一編號檢查方法
居留證
營利事利統一編號
國民身份證統一編號檢查方法
以國民身份證統一編號B120667503為例:
區性 檢
域別 查
碼碼 碼
一、找出第一位英文字母的對應數值。
二、對應數值之個位數值乘以9,再加上十位數之值,其總和再除以10,所得之餘數為個位對應值:
例:B之對應數值為11,則其個位對應值=0
因為:【1+(1×9)】÷10,其餘數為0
三、經前述步驟將第一位英文字母轉換後,產生一個十位數字的數列:
如:B120667503→0120667503
四、再將這一數列依序乘以1、8、7、6、5、4、3、2、1
0×1=00
1×8=08
2×7=14
0×6=00
6×5=30
6×4=24
7×3=21
5×2=10
0×1=00
───
107
五、再將此總和值除以10,再取其餘數
107÷10 餘數7
六、再取這一餘數之補數
7之補數為3
七、3與檢查碼相符,此國民身份證統一編號符合邏輯檢查。
#region 臺灣身份證號碼驗證
private bool CheckIDCard_CHT(string IDCard)
{
string strFirstCode="";
if(IDCard.Length!=10)
{
return false;//長度必需為10
}
if(IDCard.Substring(1,1)!="1"&&IDCard.Substring(1,1)!="2")
{
return false;//第二位必需是1=男或者2=女
}
switch(IDCard.Substring(0,1))
{
case "A":
strFirstCode="10";
break;
case "B":
strFirstCode="11";
break;
case "C":
strFirstCode="12";
break;
case "D":
strFirstCode="13";
break;
case "E":
strFirstCode="14";
break;
case "F":
strFirstCode="15";
break;
case "G":
strFirstCode="16";
break;
case "H":
strFirstCode="17";
break;
case "I":
strFirstCode="34";
break;
case "J":
strFirstCode="18";
break;
case "K":
strFirstCode="19";
break;
case "L":
strFirstCode="20";
break;
case "M":
strFirstCode="21";
break;
case "N":
strFirstCode="22";
break;
case "O":
strFirstCode="35";
break;
case "P":
strFirstCode="23";
break;
case "Q":
strFirstCode="24";
break;
case "R":
strFirstCode="25";
break;
case "S":
strFirstCode="26";
break;
case "T":
strFirstCode="27";
break;
case "U":
strFirstCode="28";
break;
case "V":
strFirstCode="29";
break;
case "W":
strFirstCode="32";
break;
case "X":
strFirstCode="30";
break;
case "Y":
strFirstCode="31";
break;
case "Z":
strFirstCode="33";
break;
default:
return false;
}
int iAllNum=Convert.ToInt32(strFirstCode.Substring(0,1))+
Convert.ToInt32(strFirstCode.Substring(1,1))*9+
Convert.ToInt32(IDCard.Substring(1,1))*8+
Convert.ToInt32(IDCard.Substring(2,1))*7+
Convert.ToInt32(IDCard.Substring(3,1))*6+
Convert.ToInt32(IDCard.Substring(4,1))*5+
Convert.ToInt32(IDCard.Substring(5,1))*4+
Convert.ToInt32(IDCard.Substring(6,1))*3+
Convert.ToInt32(IDCard.Substring(7,1))*2+
Convert.ToInt32(IDCard.Substring(8,1))*1+
Convert.ToInt32(IDCard.Substring(9,1))*1;
if(iAllNum%10!=0)
{
return false;
}
return true;
}
#endregion
==========================================
//檢查身分識別號 ----> 包括身分證,居留證,護照號 //用於驗證控制項 function check_id(sender,e){ var id=document.all("txt_id").value.toUpperCase(); var kind=document.all("ddl_idkind").options[document.all("ddl_idkind").selectedIndex].text; //檢查身分證字號 if (kind=="身分證"){ if (id.length != 10) return(e.IsValid=false); if (isNaN(id.substr(1,9)) || (id.substr(0,1)<"A" ||id.substr(0,1)>"Z")){ return(e.IsValid=false); } var head="ABCDEFGHJKLMNPQRSTUVXYWZIO"; id = (head.indexOf(id.substring(0,1))+10) +''+ id.substr(1,9) s =parseInt(id.substr(0,1)) + parseInt(id.substr(1,1)) * 9 + parseInt(id.substr(2,1)) * 8 + parseInt(id.substr(3,1)) * 7 + parseInt(id.substr(4,1)) * 6 + parseInt(id.substr(5,1)) * 5 + parseInt(id.substr(6,1)) * 4 + parseInt(id.substr(7,1)) * 3 + parseInt(id.substr(8,1)) * 2 + parseInt(id.substr(9,1)) + parseInt(id.substr(10,1)); //判斷是否可整除 if ((s % 10) != 0) return(e.IsValid=false); //身分證字號正確 return(e.IsValid=true); //檢查居留證號碼 }else if (kind=="居留證"){ if (id.length != 10) return(e.IsValid=false); if (isNaN(id.substr(2,8)) || (id.substr(0,1)<"A" ||id.substr(0,1)>"Z") || (id.substr(1,1)<"A" ||id.substr(1,1)>"Z")){ return(e.IsValid=false); } var head="ABCDEFGHJKLMNPQRSTUVXYWZIO"; id = (head.indexOf(id.substr(0,1))+10) +''+ ((head.indexOf(id.substr(1,1))+10)%10) +''+ id.substr(2,8) s =parseInt(id.substr(0,1)) + parseInt(id.substr(1,1)) * 9 + parseInt(id.substr(2,1)) * 8 + parseInt(id.substr(3,1)) * 7 + parseInt(id.substr(4,1)) * 6 + parseInt(id.substr(5,1)) * 5 + parseInt(id.substr(6,1)) * 4 + parseInt(id.substr(7,1)) * 3 + parseInt(id.substr(8,1)) * 2 + parseInt(id.substr(9,1)) + parseInt(id.substr(10,1)); //判斷是否可整除 if ((s % 10) != 0) return(e.IsValid=false); //居留證號碼正確 return(e.IsValid=true); //檢查護照號碼 }else if (kind=="護照號"){ if (id.length > 20) return(e.IsValid=false); //護照號碼正確 return(e.IsValid=true); //其他錯誤的格式 }else{ return(e.IsValid=false); } }
C# Version
//檢查身分識別號 ----> 包括身分證,居留證,護照號
//用於驗證控制項
public static bool check_id(string id, string kind)
{
//檢查身分證字號
if (kind == "身分證")
{
if (id.Length != 10) return false;
if (!ValidateString(id.Substring(0, 1), 1) || !ValidateString(id.Substring(1, 9), 2))
{ return false; }
//if (isNaN(id.Substring(1, 9)) || (id.Substring(0, 1) < "A" || id.Substring(0, 1) > "Z"))
//{
// return(e.IsValid=false);
//}
var head = "ABCDEFGHJKLMNPQRSTUVXYWZIO";
id = (head.IndexOf(id.Substring(0, 1)) + 10) + " " + id.Substring(1, 9);
int s = Convert.ToInt32(id.Substring(0, 1)) +
Convert.ToInt32(id.Substring(1, 1)) * 9 +
Convert.ToInt32(id.Substring(2, 1)) * 8 +
Convert.ToInt32(id.Substring(3, 1)) * 7 +
Convert.ToInt32(id.Substring(4, 1)) * 6 +
Convert.ToInt32(id.Substring(5, 1)) * 5 +
Convert.ToInt32(id.Substring(6, 1)) * 4 +
Convert.ToInt32(id.Substring(7, 1)) * 3 +
Convert.ToInt32(id.Substring(8, 1)) * 2 +
Convert.ToInt32(id.Substring(9, 1)) +
Convert.ToInt32(id.Substring(10, 1));
//判斷是否可整除
if ((s % 10) != 0) return false;
//身分證字號正確
return true;
//檢查居留證號碼
}
else if (kind == "居留證")
{
if (id.Length != 10) return false;
//if (isNaN(id.substr(2,8)) || (id.substr(0,1)<"A" ||id.substr(0,1)>"Z") || (id.substr(1,1)<"A" ||id.substr(1,1)>"Z")){
// return(e.IsValid=false);
//}
if (!ValidateString(id.Substring(0, 2), 1) || !ValidateString(id.Substring(2, 8), 2))
{ return false; }
var head = "ABCDEFGHJKLMNPQRSTUVXYWZIO";
id = (head.IndexOf(id.Substring(0, 1)) + 10) + "" + ((head.IndexOf(id.Substring(1, 1)) + 10) % 10) + "" + id.Substring(2, 8);
int s = Convert.ToInt32(id.Substring(0, 1)) +
Convert.ToInt32(id.Substring(1, 1)) * 9 +
Convert.ToInt32(id.Substring(2, 1)) * 8 +
Convert.ToInt32(id.Substring(3, 1)) * 7 +
Convert.ToInt32(id.Substring(4, 1)) * 6 +
Convert.ToInt32(id.Substring(5, 1)) * 5 +
Convert.ToInt32(id.Substring(6, 1)) * 4 +
Convert.ToInt32(id.Substring(7, 1)) * 3 +
Convert.ToInt32(id.Substring(8, 1)) * 2 +
Convert.ToInt32(id.Substring(9, 1)) +
Convert.ToInt32(id.Substring(10, 1));
//判斷是否可整除
if ((s % 10) != 0) return false;
//居留證號碼正確
return true;
//檢查護照號碼
}
else if (kind == "護照號")
{
if (id.Length > 20) return false;
//護照號碼正確
return true;
//其他錯誤的格式
}
else
{
return false;
}
}
===============
(一) 長度:共八位,,全部為數字型態。
(二) 計算公式
1、各數字分別乘以 1,2,1,2,1,2,4,1。
2、公式如下:
D1 D2 D3 D4 D5 D6 D7 D8
* 1 2 1 2 1 2 4 1 (第一列 * 第二列)
A1 B1 A2 B2 A3 B3 A4 B4 (Bx:相乘後的十位數)
+ C1 C2 C3 C4 (Cx:相乘後的個位數)
X1 X2 X3 X4 X5 X6 X7 X8 (Xx:相加後的十位數)
Y7 (Yx:相加後的個位數)
Z1= X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 或
Z1= X1 + X2 + X3 + X4 + X5 + X6 + Y7 + X8
3、當第 7 位數為 7 者,可取相加之倒數第二位取 0 及 1 來計算如 Z1 及 Z2 計算其和。
4、假如 Z1 或 Z2 能被 10 整除,則表示營利事業統一編號正確。
(三) 範例 ( 以 0 0 2 3 8 7 7 8 為例 )
0 0 2 3 8 7 7 8
* 1 2 1 2 1 2 4 1 (第一列 * 第二列)
0 0 2 6 8 1 2 8 (Bx:相乘後的十位數)
+ 4 8 (Cx:相乘後的個位數)
0 0 2 6 8 5 1 8 (Xx:相加後的十位數)
0 (Yx:相加後的個位數)
Z1= 0+ 0+ 2+ 6+ 8+ 5+ 1+ 8 = 30 或
Z2= 0+ 0+ 2+ 6+ 8+ 5+ 0+ 8 = 29
因 30 能被 10 整除,故營利事利統一編號正確。
function checkTB(sid){
var tbNum = new Array(1,2,1,2,1,2,4,1);
var temp = 0;
var total = 0;
alert(sid.length);
if(sid=="") alert("請先輸入欲檢驗的營利事業統一編號!");
else if(!sid.match(/^\d{8}$/)) alert("營利事業統一編號長度不夠或格式有誤!請注意營利事業統一編號格式為八碼數字!");
else{
for(var i = 0; i < tbNum.length ;i ++){
temp = sid.charAt(i) * tbNum[i];
total += Math.floor(temp/10)+temp%10;
}
if(total%10==0 || (total%10==9 && sid.charAt(6)==7)) alert("營利事業統一編號正確!");
else alert("營利事業統一編號錯誤!");
}
}