## 編號規則

Index $n_0$ $n_1$ $n_2$ $n_3$ $n_4$ $n_5$ $n_6$ $n_7$

$s_i = t_i + d_i，\text{ where } 0 \le i \le 7 \text{ and } 0 \le s_i < 10$

$Sum\%10=0，\text{ where } Sum = \sum_{i=0}^{7}s_i$

### 例外：$n_6 = 7$

$t_6 = 2 , d_6 = 8$

$s_6 = t_6 + d_6 = 2 + 8 = 10$

$s_6 = 1, s_6' = 0$

$Sum = \sum_{i=0}^{7}s_i \text{ , } Sum' = \sum_{i=0, i \not = 6}^{7}s_i + s_6'$

$Sum\%10=0 \text{ or } Sum'\%10=0$

## 程式碼

 1 ^\d{8}$ 至於其他的驗證只能靠程式了，regexp 派不上用場，對了這次是 C++  123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 #include #include #include using namespace std; bool checkTaxId(string taxId); int main(int argc, char *argv[]) { int count = 0; while(argv[++count]); if(count!=2){ cout << "Give me an Tax-ID-Number!!!!"; return 0; } string taxId = argv[1]; bool verification = checkTaxId(taxId); cout << boolalpha << verification << endl; } bool checkTaxId(string idStr){ regex reg("^\d{8}$"); smatch m; ssub_match sm; if(!regex_match(idStr, m, reg)){ cout << "Fail, 長度錯誤" << endl; return false; } int len = 8 ; int idArray[len]; // conver char to int for (int i = 0; i < len; i++){ idArray[i] = idStr[i] - '0' ; } int s[len]; int weight[] = {1,2,1,2,1,2,4,1}; int sum; for (int i = 0; i < len; i++){ int p = idArray[i] * weight[i]; s[i] = p/10 + p%10; sum += s[i] ; } bool isLegal = sum%10==0 || (sum%10==9 && s[6]==7); if(!isLegal){ cout << "Fail, 不合法的統編驗證" << endl; } return isLegal; } 

## 參考資料

1. 林壽山 (2013-03-17)。營利事業統一編號邏輯檢查方法 。檢自 Levin’s Blog-林壽山 (2020-10-23)。
2. hero (2018-11-07)。營利事業統一編號驗證完全手冊(Javascript,Java,C#,PHP) 。檢自 Hero Think~用手摀住我的嘴 (2020-10-23)。
3. beethobear (2006-10-30)。[商用軟體]統一編號檢查碼規則 。檢自 酷!學園 (2020-10-23)。

## 更新紀錄

• 2020-12-31 發布
•
• 2020-10-24 完稿
•
• 2020-10-23 起稿