跳到主要內容

營業事業統一編號的驗證邏輯

最近剛好手邊有需求需要處理統一編號的驗證需求,因此有了這篇。
本篇根據文件,進行了文字邏輯描述,最後分別以 Dart 與 Kotlin 兩份程式碼呈現給各位,如果有認何疑問歡迎提出、討論。


邏輯步驟

首先這邊要先知道三個固定的東西
  1. 我們的營利事業統一編號的長度為:8 碼
  2. 有一組固定的邏輯乘數:1 2 1 2 1 2 4 1
  3. 檢查碼:5
    • 經過計算後的值,要能夠被檢查碼整除。
    • 這個值從 110(2021)/12/22 做了發佈,為了擴充可用數量,所以從原本的 10 調整為 5 了。
再來是根據檢查碼邏輯修正說明中所描述的內容拆解幾個步驟:
  1. 將統一編號拆解成八個值,依序各自和邏輯乘數相乘。
  2. 各自相乘後,會得到八個數字,如果其中有數字是兩位數,那就再將這兩位數相加;這樣便可以得到只有個位數的八個值。
  3. 然後再將這個八個值全部加總起來後,用檢查碼去除,看是否能整除。
  4. 最後有個追加判斷,就是原始的統一編號的第七個值是否為 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 的驗證步驟

範例二:第七位為 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
        也就是配合第七位數,再拆分成兩個算試,這時分別會獲得 21 與 20,而這兩個只要任一除以檢查碼「5」可以被整除,那這組統一編號也是正確的嘍!

如果上述文字看不懂,希望下方的步驟可以讓您了解
範例二第七位數有 7 的驗證步驟

程式碼範例

程式碼的邏輯基本上,按上方說明拆分 function,其中最後搭配檢查碼確認規則的 isCheckNumberValid 函式中,多一個 -1 的判斷式,這個原因是落在 getCheckSum 這個步驟時,在第七位數加乘後為 10 時,當執行到 checkSum += ... 這段程式碼的計算,會得到 1 而非 0 這個結果,故這是最方便的處理方式。

Dart 版本

Kotlin 版本

參考來源:

留言

這個網誌中的熱門文章

使用 Google Gemini API 快速建置自己的 Flutter App

在 2024/02/21,Flutter Team 釋出了 Google Generative AI 這個 SDK,這個 SDK 大幅簡化了 Google Gemini API 呼叫的過程。讓 Flutter 或 Dart 開發者,只要在幾行的程式碼內,就能完成 Google Gemini API 的實作;這我們只要專注在 Flutter 的開發即可。 不囉嗦!我們直接來看怎麼使用! 在導入 Gemini API SDK 後,讓我們可以用這短短的幾行程式碼,便能獲得 Gemini API 的結果。 我們先來疏理一下需要準備的步驟 取得 API Key Flutter 專案設定 SDK 自由開發~ 1. 取得 API Key 1.1 Google AI Studio 首先,我們需要到 Google AI Studio  取得 API Key, 如下圖,進到 Google Ai Studio 平臺中的  Get Api Key   頁面,可以看到 Create API Key  的按鈕 1.2 Create API Key 選擇我們 Google Cloud 上的 projects,再點擊下方的 Create API key in existing project   等待一下,就能看到如下圖一樣,可以被複製的 API Key ...

一起來玩 Studio Bot (Gemini in Android Studio)![更新:2024/04/09]

有關注今年(2023) Google IO 的 Android 開發者們,應該都有注意到一個有趣的東西,Studio Bot,它在公開後,僅在美國境內可以使用,終於在台北時間 9/22 看到它向全世界 170 以上的地區開放。 更新: 2024/04/08 正式公告 Gemini 為 Studio Bot 的基底 什麼是 Android Studio Bot 這是一個整合在 Android Studio 中的對話型 AI 輔助工具,它是基於 Google 的大型語言模型 (Large Language Model,LLM) - PaLM2 所開發,基本上就是 Google Bard 那套啦。 它可以協助我們開發 Android 應用時,能夠在不離開 Android Studio 這個開發工具的狀況下,直接以對話的方式向它提問,並獲得回應... 怎麼越說越覺得有點像以前的迴紋針... (別跳出來說自己知道我在說什麼 xD 它的第一時間公開在全世界的時間點是 2023 年 Google IO 大會發佈的影像  What's new in Android development tools  的演示過程中; 大會的演示情境是以開發過程發生異常的方式,讓我們看到可以直接打開 Studio Bot 來取得解法。 (截圖自「What's new in Android development tools」影片中) 這個工具無疑是為 Android 開發者帶來一個方便又能較為精準的解答工具,而在發佈的時間點,它僅能在還處於 Canary Build 的  Iguana ,這個 Android Studio 的預覽版本中,且也只有美國地區才能使用,而在同年的 9/22 終於 開放給全世界超過 170 個地區 使用了。 [2024/04/09 更新]  1. 更新的這個時間點,Iguana 已經是穩定版,而 Studio Bot 仍只能在預覽版 (Jellyfish 以及 Koala) 使用。 2. Studio Bot 更名為 Gemini in Android Studio 怎麼啟用 不想看啟動的操作步驟請自行跳過這段 😆 1. 先下載 預覽版 寫在前面: 如果已經有安裝 Jellyfish 之後的版本,可以 跳過這個步驟 所以想玩的朋友需要...