最近剛好手邊有需求需要處理統一編號的驗證需求,因此有了這篇。
本篇根據文件,進行了文字邏輯描述,最後分別以 Dart 與 Kotlin 兩份程式碼呈現給各位,如果有認何疑問歡迎提出、討論。
邏輯步驟
首先這邊要先知道三個固定的東西
- 我們的營利事業統一編號的長度為:8 碼
- 有一組固定的邏輯乘數:1 2 1 2 1 2 4 1
- 檢查碼:5
- 經過計算後的值,要能夠被檢查碼整除。
- 這個值從 110(2021)/12/22 做了發佈,為了擴充可用數量,所以從原本的 10 調整為 5 了。
- 將統一編號拆解成八個值,依序各自和邏輯乘數相乘。
- 各自相乘後,會得到八個數字,如果其中有數字是兩位數,那就再將這兩位數相加;這樣便可以得到只有個位數的八個值。
- 然後再將這個八個值全部加總起來後,用檢查碼去除,看是否能整除。
- 最後有個追加判斷,就是原始的統一編號的第七個值是否為 7;如果為 7 那會因為對應的邏輯乘數為 4,相乘後會得 28,再相加後會得到 10,又是兩個位數了。
所以這時候的處理方法,以算式來看,就是將位在第七位的 10,拆成 1 和 0,各別和其他七個值相加,會得到兩個待驗證值,只要其中一值能夠被檢查碼整除,即為驗證通過。
以上...
的文字描述很清楚明瞭吧 (最好是!
的文字描述很清楚明瞭吧 (最好是!
沒事,上面兩段文字我丟到 Bard 跟 ChatGPT 都得不到我要的邏輯,看不懂,不是各位的問題 QQ
範例說明
我們借用營利事業統一編號檢查碼邏輯修正說明文件中的的兩組統一編號範例,分別為 04595257 以及 10458575,二者的差異在第七位數是否為 7。
從程式的角度來看
範例一:第七位非 7 的範例
taxId = "04595257"
logicMultipliers=[1, 2, 1, 2, 1, 2, 4, 1]
- Step1:將 taxId 字串拆成各字元後和 logicMultipliers 各位數相乘
獲得 [0, 8, 5, 18, 5, 4, 20, 7] - Step2:再將其中為二位數的數字的兩個位數相加,
也就是將其中的 18 與 20 再拆成 1+8 與 2 + 0,
可以獲得 [0, 8, 5, 9, 5, 4, 2, 7] - Step3:將上個步驟的獲得陣列數字再全部加在一起
0+8+5+9+5+4+2+7 = 40
這時候可以被檢查碼「5」整除,就得知這組統一編號為正確。
如果上述文字看不懂,希望下方的步驟可以讓您了解
範例二:第七位為 7 的範例
taxId = "10458575"
logicMultipliers=[1, 2, 1, 2, 1, 2, 4, 1]
- Step1:將 taxId 字串拆成各字元後和 logicMultipliers 各位數相乘
獲得 [1,0,4,10,8,10,28,5] - Step2:再將其中為二位數的數字的兩個位數相加,
也就是將其中的兩個 10 與 28 再拆成 1 + 0、1 + 0 與 2 + 8,
可以獲得 [1, 0, 4, 1, 8, 1, 10, 5] - Step3:原本應該將上個步驟的獲得陣列數字全部加在一起,
不過這時候,其中第七個數仍數兩個位數。 - Step4:因為位在第七位數的 7 對應的 邏輯乘數是 4,
因此,這時候的算式,要拆成二個 - 1+0+4+1+8+1+1+5 = 21
- 1+0+4+1+8+1+0+5 = 20
如果上述文字看不懂,希望下方的步驟可以讓您了解
程式碼範例
程式碼的邏輯基本上,按上方說明拆分 function,其中最後搭配檢查碼確認規則的 isCheckNumberValid 函式中,多一個 -1 的判斷式,這個原因是落在 getCheckSum 這個步驟時,在第七位數加乘後為 10 時,當執行到 checkSum += ... 這段程式碼的計算,會得到 1 而非 0 這個結果,故這是最方便的處理方式。
Dart 版本
Kotlin 版本
參考來源:
留言
張貼留言