[C#] 公司統一編號格式檢查程式碼 2023年版

Taiwan CompanyID CheckCode

前言

要不是業主通知我,我還真不知道公司統一編號格式檢查邏輯在今年3月前得做修正…(汗

實作

說明都在註解裡

   /// <summary>
   /// 公司統一編號格式檢查(2023年3月版)
   /// 政府公告附件下載:https://www.fia.gov.tw/singlehtml/3?cntId=c4d9cff38c8642ef8872774ee9987283
   /// 範例說明:https://www.chi.com.tw/blog/invoicelcud
   /// </summary>
   /// <param name="CompanyId"></param>
   /// <returns></returns>
   public static bool CheckCompanyId(string CompanyId)
   {
       //空值或非8碼或非純數字
       if (string.IsNullOrEmpty(CompanyId) || CompanyId.Trim().Length != 8 || int.TryParse(CompanyId, out int CompanyNo) == false)
       {
           return false;
       }

       bool is統編第7位數字為7 = (CompanyId.Substring(6, 1)=="7");

       int[] logics = new int[] { 1, 2, 1, 2, 1, 2, 4, 1 };//邏輯乘數

       int Z = 0;//垂直乘積之和 全部加總
       int Z1 = 0;
       int Z2 = 0;

       //邏輯乘數的數量與統編長度8碼一致
       for (int i = 0; i < logics.Length; i++)
       {
           int num = Convert.ToInt32(CompanyId.Substring(i, 1));//統編單一數字拆解
           int j = num * logics[i];//乘積直寫並上下相加
           int 乘積之和 = ((j / 10) + (j % 10));//垂直乘積之和(上下數字相加)
           
           if (is統編第7位數字為7 && i==6)//統編第7位數字是"7" && 走訪到統編第7位數字時
           {
               //"乘積之和"為"10",但政府文件要我們取"0或1"兩種情況(不是10)來相加。
               Z1 += 0;
               Z2 += 1;
              //Z 不理它
           }
           else
           {
               Z += 乘積之和;
               Z1 += 乘積之和;
               Z2 += 乘積之和;
           }
       }//end for
       //int old_checkNum = 10;//2023年以前的舊版
       int checkNum = 5;
       
       if (is統編第7位數字為7)
       {
           if ((Z1 % checkNum) == 0 || (Z2 % checkNum)==0)
           {
               return true;
           }
       }else if (Z % checkNum == 0)
       {
           return true;
       }
        
       return false;
   }