C# 주민등록번호 15자리 및 18자리 인증

5219 단어
/// 
///    
/// 
[Serializable]
public class IDCard
{
    /// 
    ///     
    /// 
    public string IDCardNum { get; set; }
    /// 
    ///    
    /// 
    public string Canton { get; private set; }
    /// 
    ///     
    /// 
    public DateTime Birthday { get; private set; }
    /// 
    ///   (0- ;1- )
    /// 
    public int Gander { get; private set; }
    /// 
    ///          
    /// 
    public bool IsIDCard { get; private set; }
 
    public IDCard() { }
 
    public IDCard(string IDnumber)
    {
        this.IDCardNum = IDnumber;
    }
 
 
    /// 
    /// 
    /// 
    /// 
    /// 
    public static IDCard Parse(string number)
    {
        IDCard idCard = new IDCard(number);
 
        const int s5bits = 15;
        const int s8bits = 18;
 
        #region 15 
        if (number.Length == s5bits)  //15    
        {
            //         
            for (int i = 0; i  '9'))
                {
                    throw new FormatException("      ");
                }
            }
 
            //    
            string birthday = "19" + number.Substring(6, 6);
            string year = birthday.Substring(0, 4);
            string month = birthday.Substring(4, 2);
            string day = birthday.Substring(6, 2);
            birthday = string.Format("{0}-{1}-{2}", year, month, day);
 
            DateTime date = new DateTime();
            if (DateTime.TryParse(birthday, out date))
            {
                idCard.Birthday = date;
            }
            else
            {
                throw new InvalidCastException("          ");
            }
            
            //  
            if ((number[s5bits - 1] == '0') || (number[s5bits - 1] % 2 == 0))
            {
                idCard.Gander = 0; //  
            }
            else
            {
                idCard.Gander = 1; //  
            }
 
            idCard.IsIDCard = true;
            return idCard;
        }
        #endregion
 
        #region 18 
        else if (number.Length == s8bits)  //18    
        {
            //    17      
            for (int i = 0; i  '9'))
                {
                    throw new FormatException("      ");
                }
            }
 
            char end = number[s8bits - 1];  //    
 
            //  1  x    X
            if (end == 'x')
            {
                end = 'X';
                number = number.Substring(0, s8bits - 1) + end;
            }
 
            if (!(end == 'X' || (end >= '0' && end <= '9')))
            {
                throw new FormatException("      ");
            }
            
            ///   
            int num = 0;
            char proof;
            for (int i = 17; i > 0; i--)
            {
                num = num + (int)(Math.Pow(2, i) % 11) * (number[17 - i] - 48);
            }
            num %= 11;
            switch (num)
            {
                case 0:
                    proof = '1';
                    break;
                case 1:
                    proof = '0';
                    break;
                case 2:
                    proof = 'X';
                    break;
                default:
                    proof = (char)(12 - num + 48);
                    break;
            }
 
            if (end != proof)  //          
            {
                throw new FormatException("      ");
            }
 
            //    
            string birthday = number.Substring(6, 8);
            string year = birthday.Substring(0, 4);
            string month = birthday.Substring(4, 2);
            string day = birthday.Substring(6, 2);
            birthday = string.Format("{0}-{1}-{2}", year, month, day);
 
            DateTime date = new DateTime();
            if (DateTime.TryParse(birthday, out date))
            {
                idCard.Birthday = date;
            }
            else
            {
                throw new InvalidCastException("          ");
            }
 
            //   
            idCard.Canton = number.Substring(0, 6);
 
            //  
            if ((number[16] == '0') || (number[16] % 2 == 0))
            {
                idCard.Gander = 0;  // 
            }
            else
            {
                idCard.Gander = 1;  // 
            }
 
            idCard.IsIDCard = true;
            return idCard;
        }
        #endregion
        else
        {
            throw new FormatException("          :" + number.Length);
        }
    }
 
    public static bool TryParse(string number, out IDCard card)
    {
        IDCard idCard = null;
        bool isIdCard = true;
        try
        {
            Parse(number);
        }
        catch (Exception)
        {
            isIdCard = false;
        }
        card = idCard;
        return isIdCard;
    }
}

전재 대상:https://www.cnblogs.com/fanying/p/10919038.html

좋은 웹페이지 즐겨찾기