營利事業統一編號驗證完全手冊(Javascript,Java,C#,PHP)
前幾天在網路上申請資料時,發現該網站有判斷營利事業統一編號,原來這個編號也是可以驗證的呀?真是孤陋寡聞呀!! 所以小弟在網路上找了找,發現資源還蠻多的,所以整理整理方便大家使用
首先,要先看看公式理論,這篇是在酷!學園 找到的:
(二) 計算公式
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 整除,故營利事利統一編號正確。
這個是在MyChat 數位男女查到的,不過驗證時有Bug,可能是貼上來不支援\這個字元,所以不見了再加上去即可,以下已經是可以使用的code:
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(“營利事業統一編號錯誤!”);
}
}
接下來的也是Javascript版本,是在向前走 是唯一的選擇的blog找到的:
function idchk(idvalue) {
var tmp = new String(“12121241”);
var sum = 0;
re = /^\d{8}$/;
if (!re.test(idvalue)) {
alert(“格式不對!”);
return false;
}
for (i=0; i< 8; i++) {
s1 = parseInt(idvalue.substr(i,1));
s2 = parseInt(tmp.substr(i,1));
sum += cal(s1*s2);
}
if (!valid(sum)) {
if (idvalue.substr(6,1)==”7″) return(valid(sum+1));
}
return(valid(sum));
}
function valid(n) {
return (n%10 == 0)?true:false;
}
function cal(n) {
var sum=0;
while (n!=0) {
sum += (n % 10);
n = (n – n%10) / 10; // 取整數
}
return sum;
}
接下來就是JAVA版本的驗證程式,是在台灣電腦工的blog裡找到的,同篇還有其它的驗證程式,不錯的文章喔:
.compile(“^[0-9]{8}$”);
/**
營利事業統一編號檢查程式
可至 http://www.etax.nat.gov.tw/ 查詢營業登記資料
@since 2006/07/19
/
public static boolean isValidTWBID(String twbid) {
boolean result = false;
String weight = “12121241”;
boolean type2 = false; //第七個數是否為七
if (TWBID_PATTERN.matcher(twbid).matches()) {
int tmp = 0, sum = 0;
for (int i = 0; i < 8; i++) {
tmp = (twbid.charAt(i) – '0') (weight.charAt(i) – '0');
sum += (int) (tmp / 10) + (tmp % 10); //取出十位數和個位數相加
if (i == 6 && twbid.charAt(i) == '7') {
type2 = true;
}
}
if (type2) {
if ( (sum % 10) == 0 || ( (sum + 1) % 10) == 0) { //如果第七位數為7
result = true;
}
} else {
if ( (sum % 10) == 0) {
result = true;
}
}
}
return result;
}
再來是C#的驗證程式,是在記憶是苦難的開始Blog找到的:
public static bool checkCompanyNo(string arg_CompanyNo)
{
var LOGIC = new[] { 1, 2, 1, 2, 1, 2, 4, 1 };
var intSum = 0;
for (var i = 0; i < LOGIC.Length; i++)
{
var intMultiply = int.Parse(arg_CompanyNo.Substring(i,1)) * LOGIC[i];
var intAddition = ((intMultiply / 10) + (intMultiply % 10));
intSum += (intAddition == 10) ? 1 : intAddition;
}
return (intSum % 10 == 0);
}
不過這段code 怪怪的 intSum += (intAddition == 10) ? 1 : intAddition; 似乎有點問題,因為他要的是相乘連加十位數及個位數相加)後可以被整除的,但還有另一個規則是當餘數為9時而且第七位數值和基數相加為1也成立,這裡減化成這行似乎是不可行,所以還是自行調整一下吧!!
這裡還有一篇 C#的,雖然code長了點,但有發佈就要給予鼓勵,這篇是在小卓的程式天空的blog找到的:
if (strIdno == null || strIdno.Trim().Length != 8)
return false;
}
else if (!isInteger(strIdno))
return false;
}
int ii;
try
ii = Convert.ToInt32(strIdno);
}
catch (Exception)
return false;
}
int c1;
int c2;
int c3;
int c4;
int c5;
int c6;
int c7;
int c8;
try
c1 = Convert.ToInt32(strIdno.Substring(0, 1));
c2 = Convert.ToInt32(strIdno.Substring(1, 1));
c3 = Convert.ToInt32(strIdno.Substring(2, 1));
c4 = Convert.ToInt32(strIdno.Substring(3, 1));
c5 = Convert.ToInt32(strIdno.Substring(4, 1));
c6 = Convert.ToInt32(strIdno.Substring(5, 1));
c7 = Convert.ToInt32(strIdno.Substring(6, 1));
c8 = Convert.ToInt32(strIdno.Substring(7, 1));
}
catch (Exception)
return false;
}
int y = c1 + c3 + c5 + c8;
int t = c2 * 2;
y = y + t / 10 + t % 10;
t = c4 * 2;
y = y + t / 10 + t % 10;
t = c6 * 2;
y = y + t / 10 + t % 10;
t = c7 * 4;
y = y + t / 10 + t % 10;
int k = y;
if (y % 10 == 0)
return true;
}
if (c7 == 7)
y -= 9;
return y % 10 == 0;
}
else
return false;
}
}
所以大致目前常用語言都有了,好像尚缺PHP,雖然小弟喜歡使用Javascript的驗證,不過好像找不太到PHP版本的,因此小弟動手寫了一個:
$tbNum = array(1,2,1,2,1,2,4,1);
if(strlen($sid)!=8 || !eregi(“^[0-9\*]{8}”,$sid)) return false;
$intSum = 0;
for ($i = 0; $i < count($tbNum); $i++)
{
$intMultiply=substr($sid,$i,1)*$tbNum[$i];
$intAddition=(floor($intMultiply / 10) + ($intMultiply % 10));
$intSum+=$intAddition;
}
return ($intSum % 10 == 0 ) || ($intSum%10==9 && substr($sid,6,1)==7);
}
參考資料:
.酷!學園 – [商用軟體]統一編號檢查碼規則 – 驗證公式
.MyChat 數位男女 – 營利事業統一編號邏輯檢查 -JavaScript 驗證程式 但有bug
.向前走 是唯一的選擇 統一編號的檢查 By JavaScript -JavaScript 驗證程式
.台灣電腦工 Java版-常用的身份證、IP、統一編號..檢查程式 -Java 驗證程式
.記憶是苦難的開始 檢驗公司統一編號是否正確 C# -C# 驗證程式
.檢查統一編號是不是正確 – 小卓的程式天空- 點部落
其實我有寫php的版本@@
http://www.wretch.cc/blog/himiro/10394316
[回應]
hero 回應:
10 11 月, 2008 at 14:34
^^ 呵~原來大大您有PHP版的呀~
哈~害我白寫了~~
[回應]
不過你寫的比較漂亮呢
我的冗長多了
[回應]
Hero 回應:
13 11 月, 2008 at 09:37
^^~還好啦! 反正黑貓白貓 能抓到老鼠的就是好貓~
[回應]
// 統一編號驗證
public static bool ChkCN(string CompanyNo)
{
/* Ex:00238778
* Step1.將值相乘固定值
* 0 * 1 = 0
* 0 * 2 = 0
* 2 * 1 = 2
* 3 * 2 = 6
* 8 * 1 = 8
* 7 * 2 = 14
* 7 * 4 = 28
* 8 * 1 = 8
*
* Step2.將值取出十位數及各位數
* 十位數 個位數
* 0 / 10 = 0 0 % 10 = 0
* 0 / 10 = 0 0 % 10 = 0
* 2 / 10 = 0 2 % 10 = 2
* 6 / 10 = 0 6 % 10 = 6
* 8 / 10 = 0 8 % 10 = 8
* 14/ 10 = 1 14% 10 = 4
* 28/ 10 = 2 28% 10 = 8
* 8 / 10 = 0 8 % 10 = 8
*
* Step3.將Step2.的全部結果值加總
* (0 0 0 0 0 1 2 0) (0 0 2 6 8 4 8 8) = 39
*
* Step4.判斷結果值
* 如果是正確的統一編號有兩種判斷方式
* 第一種:加總值 39 % 10 餘數為0的話則條件成立
* 第二種:加總值 39 % 9 餘數為9的話 且 統一編號的第6碼為7者條件成立
*
*/
// 相乘值
var LOGIC = new[] { 1, 2, 1, 2, 1, 2, 4, 1 };
// 加總計算用
var intSum = 0;
for (var i = 0; i < LOGIC.Length; i ) { intSum = ((Convert.ToInt16(CompanyNo.Substring(i, 1)) * LOGIC[i]) / 10) ((Convert.ToInt16(CompanyNo.Substring(i, 1)) * LOGIC[i]) % 10); } return (intSum % 10 == 0) | (intSum % 10 == 9
[回應]
Hero 回應:
26 2 月, 2010 at 08:55
謝謝Eric 的分享
[回應]
您好,
感謝您的程式!
剛試了別人提供的規則寫出來的驗證條件確無法通過認證
不是我寫錯,我用那公式直接驗證也是錯
用你的就 OK 了
由於 PHP 5.3 已經不支援 eregi 函數
要把 eregi 那個判斷式修改成即可
!preg_match("/[0-9]+/", $sid)
感恩蛤~
[回應]
hero 回應:
23 3 月, 2014 at 07:02
@Goodspeed,
呵~我也是從錯中學~也謝謝你的分享~^^
[回應]