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;
}