2009年12月25日 星期五

公司統一編號驗證

國稅局目前網頁上不提供,這是從其他部落格找到的,我稍微修改過。
工具:PowerBuilder

先來看一段驗證公式(來源:酷!學園):


(一) 長度:共八位,,全部為數字型態。
(二) 計算公式
1、各數字分別乘以1,2,1,2,4,1。
2、公式如下:
_D1D2D3D4D5D6D7D8
x 1 2 1 2 1 2 4 1 (第一列 * 第二列)

_A1B1A2B2A3B3A4B4 (Bx:相乘後的十位數)
+  C1  C2  C3  C4 (Cx:相乘後的個位數)

_X1X2X3X4X5X6X7X8 (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 整除,則表示營利事業統一編號正確。
(三) 範例 ( 以 00238778 為例 )
_00238778
x12121241 (第一列 * 第二列)

_00268128 (Bx:相乘後的十位數)
+     48  (Cx:相乘後的個位數)

_00268518 (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 整除,故營利事利統一編號正確。
以上如果你可以馬上看得懂,我真的很佩服你。

以下是powerbuilder版本的程式碼

先建立一個 function 物件 f_checktaxid , 回傳值為 Boolean
傳入參數為 as_taxid 型態為 String
程式碼如下:

//********************************************************
// 統一編號驗證
//********************************************************
// 輸入統一編號字串,合法字串者回傳true,否則為false
// Argument:
//        as_taxid : String    統一編號字串
// Return:
//        Boolean : 合法為true,否則為false
//********************************************************
integer    li_base[8] = {1,2,1,2,1,2,4,1}        // 積數
integer    li_no , li_tmp
Long        ll_totl
// 檢查NULL值
if isnull(as_taxid) then Return false
// 檢查是否為8位元數字
if not IsAllArabic(as_taxid) or len(as_taxid) <> 8 then Return false
// 乘上積數並總和
for li_no = 1 to 8
    li_tmp        = integer(mid(as_taxid , li_no , 1)) * li_base[li_no]
    ll_totl        += truncate(li_tmp / 10 , 0) + mod(li_tmp , 10)
next
// 驗證總和值
if (mod(ll_totl , 10) = 0) OR (mod(ll_totl , 10) = 9 AND mid(as_taxid , 7 , 1) = "7") then
    // 合法
    Return True
end if

Return false


程式看起來就沒那麼複雜咧?

1 個回應:

wsxwhx661 提到...
網誌管理員已經移除這則留言。