【原创代码】身份证转换与数据类型判定类

近期做的项目,客户对身份证校验要求很高,所以连抄带写做了这个类,放在这里就当作代码库积累吧。包括一个有点意思的数据类型判定类,实现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(143), 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(
151);
            }

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


点击此处下载

posted on 2006-06-01 15:52  Shadower  阅读(605)  评论(2)    收藏  举报

导航