找回密碼
 立即註冊
搜索
熱搜: SQL C# AI F1
查看: 2943|回復: 0

[.net] C# 身分證號及統一證號(居留證)判斷

[複製鏈接]
灌水成績
726
3
111783
主題
回帖
積分

等級頭銜

積分成就 威望 : 999
貢獻 : 999
金錢 : 108057
精華 : 0
在線時間 : 333 小時
最後登錄 : 2026-5-8

豐功偉業

分享
分享 分享到Facebook

好康介紹

準備中
發表於 2019-3-26 16:55:24 | 顯示全部樓層 |閱讀模式
琪琪小站免責聲明
本論壇仍是開放式討論平台,本論壇對於所有討論的真實性、完整性及立場等,不負任何法律責任。
而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。
於有關情形下,用戶應尋求專業意見 (如涉及醫療、法律或投資等問題)。
由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。
kikishop有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。
切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。
本網站保留一切法律權利。
[mw_shl_code=csharp,true]        /// <summary>
        /// 判斷身分證號及統一證號是否正確,並判斷性別及國籍
        ///
        /// 國籍
        /// 本署核發之外來人口統一證號編碼,共計10碼,前2碼使用英文字母,
        ///第1碼為區域碼(同國民身分證註1)
        ///第2碼為性別碼(註 2)、3至10碼為阿拉伯數字,其中第3至9碼為流水號、第10碼為檢查號碼。
        ///註1:英文字母代表直轄市、縣、市別:
        /// 台北市 A、台中市 B、基隆市 C、台南市 D、高雄市 E
        /// 新北市 F、宜蘭縣 G、桃園縣 H、嘉義市 I、新竹縣 J
        /// 苗栗縣 K、原台中縣 L、南投縣 M、彰化縣 N、新竹市 O
        /// 雲林縣 P、嘉義縣 Q、原台南縣 R、原高雄縣 S、屏東縣 T
        /// 花蓮縣 U、台東縣 V、金門縣 W、澎湖縣 X、連江縣 Z
        /// 註2:
        /// 臺灣地區無戶籍國民、大陸地區人民、港澳居民:
        /// 男性使用A、女性使用B
        ///外國人:
        /// 男性使用C、女性使用D
        /// </summary>
        /// <param name="str"></param>
        public bool CheckIdno(String str)
        {
            string sex = "";
            string nationality = "";
            if (str == null || string.IsNullOrWhiteSpace(str) || str.Length != 10)
            {
                return false;
            }
            char[] pidCharArray = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
            str = str.ToUpper(); // 轉換大寫
            char[] strArr = str.ToCharArray(); // 字串轉成char陣列
            int verifyNum = 0;

            string pat = @"[A-Z]{1}[1-2]{1}[0-9]{8}";
            // Instantiate the regular expression object.
            Regex rTaiwan = new Regex(pat, RegexOptions.IgnoreCase);
            // Match the regular expression pattern against a text string.
            Match mTaiwan = rTaiwan.Match(str);
            // 檢查身分證字號
            if (mTaiwan.Success)
            {
                // 原身分證英文字應轉換為10~33,這裡直接作個位數*9+10
                int[] pidIDInt = { 1, 10, 19, 28, 37, 46, 55, 64, 39, 73, 82, 2, 11, 20, 48, 29, 38, 47, 56, 65, 74, 83, 21, 3, 12, 30 };
                // 第一碼
                verifyNum = verifyNum + pidIDInt[Array.BinarySearch(pidCharArray, strArr[0])];
                // 第二~九碼
                for (int i = 1, j = 8; i < 9; i++, j--)
                {
                    verifyNum += Convert.ToInt32(strArr.ToString(), 10) * j;
                }
                // 檢查碼
                verifyNum = (10 - (verifyNum % 10)) % 10;
                bool ok = verifyNum == Convert.ToInt32(strArr[9].ToString(), 10);
                if (ok)
                {
                    // 判斷性別 & 國籍
                    sex = "男";
                    if (strArr[1] == '2') sex = "女";
                    nationality = "本國籍";
                }
                return ok;
            }

            // 檢查統一證號(居留證)
            verifyNum = 0;
            pat = @"[A-Z]{1}[A-D]{1}[0-9]{8}";
            // Instantiate the regular expression object.
            Regex rForeign = new Regex(pat, RegexOptions.IgnoreCase);
            // Match the regular expression pattern against a text string.
            Match mForeign = rForeign.Match(str);
            if (mForeign.Success)
            {
                // 原居留證第一碼英文字應轉換為10~33,十位數*1,個位數*9,這裡直接作[(十位數*1) mod 10] + [(個位數*9) mod 10]
                int[] pidResidentFirstInt = { 1, 10, 9, 8, 7, 6, 5, 4, 9, 3, 2, 2, 11, 10, 8, 9, 8, 7, 6, 5, 4, 3, 11, 3, 12, 10 };
                // 第一碼
                verifyNum += pidResidentFirstInt[Array.BinarySearch(pidCharArray, strArr[0])];
                // 原居留證第二碼英文字應轉換為10~33,並僅取個位數*6,這裡直接取[(個位數*6) mod 10]
                int[] pidResidentSecondInt = { 0, 8, 6, 4, 2, 0, 8, 6, 2, 4, 2, 0, 8, 6, 0, 4, 2, 0, 8, 6, 4, 2, 6, 0, 8, 4 };
                // 第二碼
                verifyNum += pidResidentSecondInt[Array.BinarySearch(pidCharArray, strArr[1])];
                // 第三~八碼
                for (int i = 2, j = 7; i < 9; i++, j--)
                {
                    verifyNum += Convert.ToInt32(strArr.ToString(), 10) * j;
                }
                // 檢查碼
                verifyNum = (10 - (verifyNum % 10)) % 10;
                bool ok = verifyNum == Convert.ToInt32(strArr[9].ToString(), 10);
                if (ok)
                {
                    // 判斷性別 & 國籍
                    sex = "男";
                    if (strArr[1] == 'B' || strArr[1] == 'D') sex = "女";
                    nationality = "外籍人士";
                    if (strArr[1] == 'A' || strArr[1] == 'B') nationality += "(臺灣地區無戶籍國民、大陸地區人民、港澳居民)";
                }
                return ok;
            }
            return false;
        }[/mw_shl_code]

琪琪小站免責聲明
本論壇仍是開放式討論平台,本論壇對於所有討論的真實性、完整性及立場等,不負任何法律責任。
而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。
於有關情形下,用戶應尋求專業意見 (如涉及醫療、法律或投資等問題)。
由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。
kikishop有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。
切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。
本網站保留一切法律權利。
FengLeo Internet Multimedia Services WorkStation
*********************************************************
Genie
WebUrl:https://www.fengleo.com/
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|Ki Ki Shop |網站地圖

GMT+8, 2026-5-9 11:44 , Processed in 0.089204 second(s), 22 queries .

Powered by FengLeo X3.5

© 2020-2025 Fengleo.com

快速回復 返回頂部 返回列表