【臺灣ID驗證系列】電子發票捐贈碼驗證

ID 驗證系列第三彈!
處理完電子發票條碼後,順便來處理捐贈碼。果然壓力大的時候來做雜事最抒壓了 XDDD

捐贈碼
捐贈碼(圖片來源: 課電子發票整合服務平台



編號規則

捐贈碼的規則頗簡單:

  • 總長度介於 3 至 7 碼
  • 由純數字所組成



程式碼

用 Regular Expression

1
^\d{3,7}$


上次說要用 C 寫,可能得先去複習一下語法,好久沒寫 C 了,而且好像沒有用 C 寫過 regex?都可以再寫一篇網誌了…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdbool.h>
#include <regex.h>  
#include <assert.h>


bool check_love_code(char* code){
    regex_t preg; 
    const char* pattern = "^[0-9]{3,7}$";
    int success = regcomp(&preg, pattern, REG_EXTENDED|REG_ICASE); 
    assert(success==0);

    regmatch_t matchptr[1];
    const size_t nmatch = 1;   
    int status = regexec(&preg, code, nmatch, matchptr, 0); 
    
    bool result = false;
    if (status == 0){
        result = true;
    }

    regfree(&preg);    
    return result;
}

int main(){
    char* code = "1234"; 
    bool is_verify = check_love_code(code);
    printf(is_verify ? "true" : "false");
    return 0;
}


加點錯誤訊息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

bool check_love_code(char* code){ 
    size_t length = strlen(code);
    if(length<3 || length>7){
       printf("Fail, 長度錯誤\n");
       return false;
    }

 
    for (size_t i = 0; i < length; i++) {
      int ascii = (int) code[i];
      bool is_number = (ascii>=48 && ascii<=57);
      if(!is_number){
        printf("Fail, 非數字\n");
        return false;
      }
    }
  
    return true;
}

int main(){
    char* code = "987A"; 
    bool is_verify = check_love_code(code);
    printf(is_verify ? "true" : "false");
    printf("\n");
    return 0;
}


難得兩個長度差不多 XDDD,通常 regex 會簡潔很多。



參考資料

  1. (2017-12-05)。手機條碼、自然人憑證條碼與捐贈碼檢核規則 。檢自 鯨躍科技有限公司官方網站 (2020-08-28)。



更新紀錄

最後更新日期:2020-09-24
     
  • 2020-09-24 發布
  •  
  • 2020-09-11 完稿
  •  
  • 2020-08-28 起稿