c#正則表達式驗證身份證

身份證格式驗證,以及15.18位互轉方法 

/// <summary>
    /// 驗證18位身份證格式
    /// </summary>
    /// <param name="cid"></param>
    /// <returns>返回字符串,出錯信息</returns>
    public string CheckCidInfo18(string cid)
    {
        string[] aCity = new string[] { null, null, null, null, null, null, null, null, null, null, null, "北京", "天津", "河北", "山西", "內蒙古", null, null, null, null, null, "遼寧", "吉林", "黑龍江", null, null, null, null, null, null, null, "上海", "江蘇", "浙江", "安微", "福建", "江西", "山東", null, null, null, "河南", "湖北", "湖南", "廣東", "廣西", "海南", null, null, null, "重慶", "四川", "貴州", "雲南", "西藏", null, null, null, null, null, null, "陝西", "甘肅", "青海", "寧夏", "新疆", null, null, null, null, null, "臺灣", null, null, null, null, null, null, null, null, null, "香港", "澳門", null, null, null, null, null, null, null, null, "國外" };
        double iSum = 0;
        System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^\d{17}(\d|X|x)$");
        System.Text.RegularExpressions.Match mc = rg.Match(cid);
        if (!mc.Success)
        {
            return "- 您的身份證號碼格式有誤!";
        }
        cid = cid.ToLower();
        cid = cid.Replace("x", "a");
        if (aCity[int.Parse(cid.Substring(0, 2))] == null)
        {
            return "- 您的身份證號碼格式有誤!";//非法地區
        }
        try
        {
            DateTime.Parse(cid.Substring(6, 4) + "-" + cid.Substring(10, 2) + "-" + cid.Substring(12, 2));
        }
        catch
        {
            return "- 您的身份證號碼格式有誤!";//非法生日
        }
        for (int i = 17; i >= 0; i--)
        {
            iSum += (System.Math.Pow(2, i) % 11) * int.Parse(cid[17 - i].ToString(), System.Globalization.NumberStyles.HexNumber);

        }
        if (iSum % 11 != 1)
            return ("- 您的身份證號碼格式有誤!");//非法證號

        return "";

    }

    /// <summary>
    /// 驗證15位身份證格式
    /// </summary>
    /// <param name="cid"></param>
    /// <returns></returns>
    public string CheckCidInfo15(string cid)
    {
        string[] aCity = new string[] { null, null, null, null, null, null, null, null, null, null, null, "北京", "天津", "河北", "山西", "內蒙古", null, null, null, null, null, "遼寧", "吉林", "黑龍江", null, null, null, null, null, null, null, "上海", "江蘇", "浙江", "安微", "福建", "江西", "山東", null, null, null, "河南", "湖北", "湖南", "廣東", "廣西", "海南", null, null, null, "重慶", "四川", "貴州", "雲南", "西藏", null, null, null, null, null, null, "陝西", "甘肅", "青海", "寧夏", "新疆", null, null, null, null, null, "臺灣", null, null, null, null, null, null, null, null, null, "香港", "澳門", null, null, null, null, null, null, null, null, "國外" };

        System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^\d{15}$");
        System.Text.RegularExpressions.Match mc = rg.Match(cid);
        if (!mc.Success)
        {
            return "- 您的身份證號碼格式有誤!";
        }
        cid = cid.ToLower();
        cid = cid.Replace("x", "a");
        if (int.Parse(cid.Substring(0, 2)) > aCity.Length)
        {
            return "- 您的身份證號碼格式有誤!";//非法地區
        }
        if (aCity[int.Parse(cid.Substring(0, 2))] == null)
        {
            return "- 您的身份證號碼格式有誤!";//非法地區
        }
        try
        {
            DateTime.Parse(cid.Substring(6, 2) + "-" + cid.Substring(8, 2) + "-" + cid.Substring(10, 2));
        }
        catch
        {
            return "- 您的身份證號碼格式有誤!";//非法生日
        }
        return "";
    }

    /// <summary>
    /// 15位轉18位身份證號
    /// </summary>
    /// <param name="perIDSrc"></param>
    /// <returns></returns>
    public string per15To18(string perIDSrc)
    {
        int iS = 0;
        //加權因子常數
        int[] iW = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
        //校驗碼常數
        string LastCode = "10X98765432";
        //新身份證號
        string perIDNew;

        perIDNew = perIDSrc.Substring(0, 6);
        //填在第6位及第7位上填上‘1’,‘9’兩個數字
        perIDNew += "19";
        perIDNew += perIDSrc.Substring(6, 9);
        //進行加權求和
        for (int i = 0; i < 17; i++)
        {
            iS += int.Parse(perIDNew.Substring(i, 1)) * iW[i];
        }

        //取模運算,得到模值
        int iY = iS % 11;
        //從LastCode中取得以模爲索引號的值,加到身份證的最後一位,即爲新身份證號。
        perIDNew += LastCode.Substring(iY, 1);

        return perIDNew;
    }

    /// <summary>
    /// 18位轉15位身份證號
    /// </summary>
    /// <param name="perIDSrc"></param>
    /// <returns></returns>
    public string per18To15(string perIDSrc)
    {
        //前6位
        string str1 = perIDSrc.Substring(0, 6);
        //後9位
        string str2 = perIDSrc.Substring(8, 9);
        //新字符串
        string perIDNew = str1 + str2;
        return perIDNew;

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章