【原创代码】身份证转换与数据类型判定类
近期做的项目,客户对身份证校验要求很高,所以连抄带写做了这个类,放在这里就当作代码库积累吧。包括一个有点意思的数据类型判定类,实现string2Numeric和string2Date的无异常转换。
/// <summary>
        /// 检查身份证号码序列是否合法
        /// </summary>
        /// <param name="cardId">身份证号码</param>
        /// <returns>正确:返回空值,否则返回错误原因</returns>
        public static string Check(string cardId)
        {
            if (TypeHelper.IsNull(cardId)) return "身份证:无效空对象";
            
            int len = cardId.Length;
            if (len != 15 && len != 18)
            {
                return "身份证:长度不正确";
            }
            if (!CheckAddress(cardId))
            {
                return "身份证:籍贯信息错误";
            }
            if (!CheckBirthday(cardId))
            {
                return "身份证:无效的出生日期,必须在“1950年1月1日”到“2010年12月31日”之间";
            }
            if (len >= 17)
            {
                int t;
                
                if (TypeHelper.TryIntParse(cardId.Substring(14, 3), out t))
                {
                    if (t == -1)
                    {
                        return "身份证:无效号码,前17位号码必须为数字";
                    }
                }
                else
                {
                    return "身份证:无效号码,前17位号码必须为数字";
                }
            }
            if (len == 18 && !CheckSumCode(cardId))
            {
                return "身份证:最后一位校验码无效";
            }
            return string.Empty;
        }
        /// <summary>
        /// 15位与18位身份证互换
        /// </summary>
        /// <param name="cardId">要转换的身份证号码</param>
        /// <param name="from">原始位数</param>
        /// <param name="to">目标位数</param>
        public static string TryConvert(string cardId, int from, int to)
        {
            if (TypeHelper.IsNull(cardId)) return string.Empty;
            
            int len = cardId.Length;
            
            StringBuilder sb = new StringBuilder(cardId);
            
            //如果是15位号码
            if (len == 15 && from == 15 && to == 18)
            {
                sb.Insert(6,"19"); 
                sb.Append(ParseSumCode(sb.ToString()));
            }
            
            if (len == 18 && from == 18 && to == 15)
            {
                sb.Remove(6,2);
                sb.Remove(15, 1);
            }
            
            return sb.ToString();
        }
        /// <summary>
        /// 检验身份证号码信息是否正确
        /// </summary>
        /// <param name="cardId">身份证号码:15位或18位</param>
        /// <param name="address">籍贯</param>
        /// <param name="birthday">出生日期</param>
        /// <param name="sex">性别</param>
        /// <returns>正确:返回空,否则返回错误信息</returns>
        public static string Validate(string cardId, string address, string birthday, string sex)
        {
            //先检查身份证号码序列是否正确
            string v = Check(cardId);
            if (v.Length != 0)
            {
                return v;
            }
            
            if (!TypeHelper.IsEmptyString(address))
            {
                v = ParseAddress(cardId);                
                if(v == null || v.CompareTo(address) != 0)
                {
                    return "籍贯信息与身份证不符,籍贯应为:" + v;
                }
            }
            if(!TypeHelper.IsEmptyString(birthday))
            {
                v = ParseBirthday(cardId);
                DateTime t1 = Convert.ToDateTime(v);
                DateTime t2 = Convert.ToDateTime(birthday);
                if (t1 != t2)
                {
                    return "出生日期信息与身份证不符,出生日期应为:" + v;
                }
            }
            if(!TypeHelper.IsEmptyString(sex))
            {
                v = ParseSex(cardId);
            
                if ( v.CompareTo(sex) != 0)
                {
                    return "性别信息与身份证不符,性别应为:" + v;
                }
            }
            return string.Empty;
        } 点击此处下载
                    
                

            
                
            
        
浙公网安备 33010602011771号