.NET身份证验证

身份证号码编码规则及校验位校验算法

算法地址:http://jingyan.baidu.com/article/7f41ececff944a593d095c8c.html

 

简单验证长度

 1         /// <summary>
 2         /// 检查身份证基本信息
 3         /// </summary>
 4         /// <returns>结果</returns>
 5         private string CheckAndParse()
 6         {
 7             if (string.IsNullOrWhiteSpace(this.Id))
 8             {
 9                 return "身份证号码不能为空";
10             }
11             if (this.Id.Length == 15)
12             {
13                 return this.ParseCardInfo15();
14             }
15             if (this.Id.Length == 18)
16             {
17                 return this.ParseCardInfo18();
18             }
19             return "身份证号码必须为15位或18位";
20         }
简单验证

 身份证分为2中 18位 OR 15位

 验证先用正则表达式进行初步验证 并且取出 身份证上面包含的信息(地区 生日 随机码 性别 尾号)

18位身份证

        /// <summary>
        /// 18位身份证
        /// </summary>
        /// <returns>结果</returns>
        private string ParseCardInfo18()
        {
            const string CardIdParttern = @"(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d{1})([\d,x,X]{1})";
            Match match = Regex.Match(this.Id, CardIdParttern);
            if (match.Success)
            {
                this.areaCode = match.Groups[1].Value;
                string year = match.Groups[2].Value;
                string month = match.Groups[3].Value;
                string day = match.Groups[4].Value;
                this.birthCode = year + month + day;
                this.randomCode = match.Groups[5].Value;
                this.sexCode = char.Parse(match.Groups[6].Value);
                string verifyCode = match.Groups[7].Value.ToUpper();

                if (this.ValidateVerifyCode(this.Id.Substring(0, 17), char.Parse(verifyCode)))
                {
                    try
                    {
                        this.Birth = BirthDate.GetBirthDate(year, month, day);
                        this.Area = AreaCodeMapping.GetArea(this.areaCode);
                        Sex = GetSex(this.sexCode);
                    }
                    catch (System.Exception ex)
                    {
                        return ex.Message;
                    }
                    return string.Empty;
                }
            }
            return "身份证号码格式错误";
        }
18位

 

15位身份证

 1         /// <summary>
 2         /// 15位身份证
 3         /// </summary>
 4         /// <returns>结果</returns>
 5         private string ParseCardInfo15()
 6         {
 7             const string CardIdParttern = @"(\d{6})(\d{2})(\d{2})(\d{2})(\d{2})(\d{1})";
 8             Match match = Regex.Match(this.Id, CardIdParttern);
 9             if (match.Success)
10             {
11                 this.areaCode = match.Groups[1].Value;
12                 string year = match.Groups[2].Value;
13                 string month = match.Groups[3].Value;
14                 string day = match.Groups[4].Value;
15                 this.birthCode = year + month + day;
16                 this.randomCode = match.Groups[5].Value;
17                 this.sexCode = char.Parse(match.Groups[6].Value);
18 
19                 try
20                 {
21                     this.Area = AreaCodeMapping.GetArea(this.areaCode);
22                     this.Birth = BirthDate.GetBirthDate(year, month, day);
23                     Sex = GetSex(this.sexCode);
24                 }
25                 catch (System.Exception ex)
26                 {
27                     return ex.Message;
28                 }
29                 return string.Empty;
30             }
31             return "身份证号码格式错误";
32         }
15位

 

校验代码

  1 namespace Notify.Solution.Code.IdentityCard
  2 {
  3     /// <summary>
  4     /// 验证类
  5     /// </summary>
  6     public class Validator
  7     {
  8         /// <summary>
  9         /// 验证码
 10         /// </summary>
 11         private readonly char[] verifyCodeMapping = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
 12 
 13         /// <summary>
 14         /// 地区代码
 15         /// </summary>
 16         private string areaCode;
 17 
 18         /// <summary>
 19         /// 生日
 20         /// </summary>
 21         private string birthCode;
 22 
 23         /// <summary>
 24         /// 随机
 25         /// </summary>
 26         private string randomCode;
 27 
 28         /// <summary>
 29         /// 性别
 30         /// </summary>
 31         private char sexCode;
 32 
 33         /// <summary>
 34         /// Initializes a new instance of the <see cref="Validator"/> class. 
 35         /// </summary>
 36         /// <param name="id">Id</param>
 37         public Validator(string id)
 38         {
 39             this.Id = id;
 40             this.Success = false;
 41             this.ErrorMessage = string.Empty;
 42             this.Area = null;
 43             this.Birth = BirthDate.Empty;
 44             this.Sex = Sex.Male;
 45         }
 46 
 47         /// <summary>
 48         /// 身份证ID
 49         /// </summary>
 50         public string Id { get; private set; }
 51 
 52         /// <summary>
 53         /// 结果
 54         /// </summary>
 55         public bool Success { get; private set; }
 56 
 57         /// <summary>
 58         /// 错误信息
 59         /// </summary>
 60         public string ErrorMessage { get; private set; }
 61 
 62         /// <summary>
 63         ///  区域信息
 64         /// </summary>
 65         public AreaInformation Area { get; private set; }
 66 
 67         /// <summary>
 68         ///  生日
 69         /// </summary>
 70         public BirthDate Birth { get; private set; }
 71 
 72         /// <summary>
 73         /// 性别
 74         /// </summary>
 75         public Sex Sex { get; private set; }
 76 
 77         /// <summary>
 78         /// 执行比较结果
 79         /// </summary>
 80         /// <returns>结果</returns>
 81         public bool Execute()
 82         {
 83             string msg = this.CheckAndParse();
 84             if (string.IsNullOrWhiteSpace(msg))
 85             {
 86                 this.ErrorMessage = string.Empty;
 87                 this.Success = true;
 88             }
 89             else
 90             {
 91                 this.ErrorMessage = msg;
 92                 this.Success = false;
 93             }
 94             return this.Success;
 95         }
 96 
 97         /// <summary>
 98         /// IdentityCard18
 99         /// </summary>
100         public string IdentityCard18
101         {
102             get
103             {
104                 if (string.IsNullOrWhiteSpace(this.Id))
105                 {
106                     return "身份证号码不能为空";
107                 }
108                 if (this.Success && this.Id.Length == 15)
109                 {
110                     return this.ToCardInfo18();
111                 }
112                 return this.Id;
113             }
114         }
115 
116         /// <summary>
117         /// ToCardInfo18
118         /// </summary>
119         /// <returns>结果</returns>
120         private string ToCardInfo18()
121         {
122             string bodyCode = GetBodyCode(this.areaCode, "19" + this.birthCode, this.randomCode, this.sexCode);
123             char verifyCode = this.GetVerifyCode(bodyCode);
124             return bodyCode + verifyCode;
125         }
126 
127         /// <summary>
128         /// 获取bodyCode
129         /// </summary>
130         /// <param name="areaCode">areaCode</param>
131         /// <param name="birthCode">birthCode</param>
132         /// <param name="randomCode">randomCode</param>
133         /// <param name="sexCode">sexCode</param>
134         /// <returns></returns>
135         private static string GetBodyCode(string areaCode, string birthCode, string randomCode, char sexCode)
136         {
137             return areaCode + birthCode + randomCode + sexCode.ToString();
138         }
139 
140         /// <summary>
141         /// 检查身份证基本信息
142         /// </summary>
143         /// <returns>结果</returns>
144         private string CheckAndParse()
145         {
146             if (string.IsNullOrWhiteSpace(this.Id))
147             {
148                 return "身份证号码不能为空";
149             }
150             if (this.Id.Length == 15)
151             {
152                 return this.ParseCardInfo15();
153             }
154             if (this.Id.Length == 18)
155             {
156                 return this.ParseCardInfo18();
157             }
158             return "身份证号码必须为15位或18位";
159         }
160 
161         /// <summary>
162         /// 18位身份证
163         /// </summary>
164         /// <returns>结果</returns>
165         private string ParseCardInfo18()
166         {
167             const string CardIdParttern = @"(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d{1})([\d,x,X]{1})";
168             Match match = Regex.Match(this.Id, CardIdParttern);
169             if (match.Success)
170             {
171                 this.areaCode = match.Groups[1].Value;
172                 string year = match.Groups[2].Value;
173                 string month = match.Groups[3].Value;
174                 string day = match.Groups[4].Value;
175                 this.birthCode = year + month + day;
176                 this.randomCode = match.Groups[5].Value;
177                 this.sexCode = char.Parse(match.Groups[6].Value);
178                 string verifyCode = match.Groups[7].Value.ToUpper();
179 
180                 if (this.ValidateVerifyCode(this.Id.Substring(0, 17), char.Parse(verifyCode)))
181                 {
182                     try
183                     {
184                         this.Birth = BirthDate.GetBirthDate(year, month, day);
185                         this.Area = AreaCodeMapping.GetArea(this.areaCode);
186                         Sex = GetSex(this.sexCode);
187                     }
188                     catch (System.Exception ex)
189                     {
190                         return ex.Message;
191                     }
192                     return string.Empty;
193                 }
194             }
195             return "身份证号码格式错误";
196         }
197 
198         /// <summary>
199         /// 验证验证码
200         /// </summary>
201         /// <param name="bodyCode">bodyCode</param>
202         /// <param name="verifyCode">verifyCode</param>
203         /// <returns>结果</returns>
204         private bool ValidateVerifyCode(string bodyCode, char verifyCode)
205         {
206             char calculatedVerifyCode = this.GetVerifyCode(bodyCode);
207             return calculatedVerifyCode == verifyCode;
208         }
209 
210         /// <summary>
211         /// 15位身份证
212         /// </summary>
213         /// <returns>结果</returns>
214         private string ParseCardInfo15()
215         {
216             const string CardIdParttern = @"(\d{6})(\d{2})(\d{2})(\d{2})(\d{2})(\d{1})";
217             Match match = Regex.Match(this.Id, CardIdParttern);
218             if (match.Success)
219             {
220                 this.areaCode = match.Groups[1].Value;
221                 string year = match.Groups[2].Value;
222                 string month = match.Groups[3].Value;
223                 string day = match.Groups[4].Value;
224                 this.birthCode = year + month + day;
225                 this.randomCode = match.Groups[5].Value;
226                 this.sexCode = char.Parse(match.Groups[6].Value);
227 
228                 try
229                 {
230                     this.Area = AreaCodeMapping.GetArea(this.areaCode);
231                     this.Birth = BirthDate.GetBirthDate(year, month, day);
232                     Sex = GetSex(this.sexCode);
233                 }
234                 catch (System.Exception ex)
235                 {
236                     return ex.Message;
237                 }
238                 return string.Empty;
239             }
240             return "身份证号码格式错误";
241         }
242 
243         /// <summary>
244         /// 获取验证码
245         /// </summary>
246         /// <param name="bodyCode">bodyCode</param>
247         /// <returns>结果</returns>
248         private char GetVerifyCode(string bodyCode)
249         {
250             char[] bodyCodeArray = bodyCode.ToCharArray();
251             ////int sum = 0;
252             ////for (int index = 0; index < bodyCodeArray.Length; index++)
253             ////{
254             ////    sum += int.Parse(bodyCodeArray[index].ToString()) * GetWeight(index);
255             ////}
256             ////return this.verifyCodeMapping[sum % 11];
257             int sum = bodyCodeArray.Select((t, index) => int.Parse(t.ToString()) * GetWeight(index)).Sum();
258             return this.verifyCodeMapping[sum % 11];
259         }
260 
261         /// <summary>
262         /// GetWeight
263         /// </summary>
264         /// <param name="index">index</param>
265         /// <returns>index</returns>
266         private static int GetWeight(int index)
267         {
268             return (1 << (17 - index)) % 11;
269         }
270 
271         /// <summary>
272         /// 获取性别
273         /// </summary>
274         /// <param name="sexCode">性别代码</param>
275         /// <returns>性别</returns>
276         private static Sex GetSex(char sexCode)
277         {
278             return ((int)sexCode) % 2 == 0 ? Sex.Female : Sex.Male;
279         }
280     }
281 
282     /// <summary>
283     /// 生日
284     /// </summary>
285     public struct BirthDate
286     {
287         /// <summary>
288         ///289         /// </summary>
290         private readonly string year;
291 
292         /// <summary>
293         ///294         /// </summary>
295         private readonly string month;
296 
297         /// <summary>
298         ///299         /// </summary>
300         private readonly string day;
301 
302         /// <summary>
303         /// 默认
304         /// </summary>
305         public static BirthDate Empty
306         {
307             get { return new BirthDate("00", "00", "00"); }
308         }
309 
310         /// <summary>
311         /// Initializes a new instance of the <see cref="BirthDate"/> struct. 
312         /// </summary>
313         /// <param name="year"></param>
314         /// <param name="month"></param>
315         /// <param name="day"></param>
316         public BirthDate(string year, string month, string day)
317         {
318             this.year = year;
319             this.month = month;
320             this.day = day;
321         }
322 
323         /// <summary>
324         /// 获取生日
325         /// </summary>
326         /// <param name="year"></param>
327         /// <param name="month"></param>
328         /// <param name="day"></param>
329         /// <returns>结果</returns>
330         public static BirthDate GetBirthDate(string year, string month, string day)
331         {
332             DateTime date;
333             if (DateTime.TryParse(string.Format("{0}-{1}-{2}", year, month, day), out date))
334             {
335                 return new BirthDate(year, month, day);
336             }
337             throw new System.Exception("日期不存在");
338         }
339 
340         /// <summary>
341         ///342         /// </summary>
343         public string Year
344         {
345             get { return this.year; }
346         }
347 
348         /// <summary>
349         ///350         /// </summary>
351         public string Month
352         {
353             get { return this.month; }
354         }
355 
356         /// <summary>
357         ///358         /// </summary>
359         public string Day
360         {
361             get { return this.day; }
362         }
363 
364         /// <summary>
365         /// 重写ToString
366         /// </summary>
367         /// <returns>结果</returns>
368         public override string ToString()
369         {
370             return string.Format("{0}年{1}月{2}日", this.year, this.month, this.day);
371         }
372 
373         /// <summary>
374         /// 重写ToString
375         /// </summary>
376         /// <param name="separator">separator</param>
377         /// <returns>结果</returns>
378         public string ToString(string separator)
379         {
380             return string.Format("{1}{0}{2}{0}{3}", separator, this.year, this.month, this.day);
381         }
382     }
383 
384     /// <summary>
385     /// 性别
386     /// </summary>
387     public enum Sex
388     {
389         /// <summary>
390         ///391         /// </summary>
392         Male,
393 
394         /// <summary>
395         ///396         /// </summary>
397         Female
398     }
399 }
View Code

 

读取地区代码

  1 namespace Notify.Solution.Code.IdentityCard
  2 {
  3     /// <summary>
  4     /// 区域配置
  5     /// </summary>
  6     public class AreaCodeMapping
  7     {
  8         /// <summary>
  9         /// 区域字典
 10         /// </summary>
 11         private static readonly Dictionary<string, Area> areas;
 12 
 13         /// <summary>
 14         /// Initializes static members of the <see cref="AreaCodeMapping"/> class. 
 15         /// </summary>
 16         static AreaCodeMapping()
 17         {
 18             areas = LoadAreaInfo();
 19         }
 20 
 21         /// <summary>
 22         /// 加载信息
 23         /// </summary>
 24         /// <returns>区域信息</returns>
 25         private static Dictionary<string, Area> LoadAreaInfo()
 26         {
 27             XmlDocument doc = LoadXmlDocument("AreaCodes.xml");
 28             XmlNode areasNode = doc.SelectSingleNode("AreaCode");
 29             if (areasNode != null)
 30             {
 31                 XmlNodeList provinceNodeList = areasNode.ChildNodes;
 32                 return LoadProvinces(provinceNodeList);
 33             }
 34 
 35             return null;
 36         }
 37 
 38         /// <summary>
 39         /// 加载XML
 40         /// </summary>
 41         /// <param name="fileName">文件名</param>
 42         /// <returns>XmlDocument</returns>
 43         private static XmlDocument LoadXmlDocument(string fileName)
 44         {
 45             var declaringType = MethodBase.GetCurrentMethod().DeclaringType;
 46             if (declaringType != null)
 47             {
 48                 string resourceName = declaringType.Namespace + "." + fileName;
 49                 Assembly assembly = Assembly.GetExecutingAssembly();
 50                 Stream stream = assembly.GetManifestResourceStream(resourceName);
 51                 XmlDocument result = new XmlDocument();
 52                 if (stream != null)
 53                 {
 54                     result.Load(stream);
 55                 }
 56                 return result;
 57             }
 58             return null;
 59         }
 60 
 61         /// <summary>
 62         /// 解析XML节点
 63         /// </summary>
 64         /// <param name="provinceNodeList">provinceNodeList</param>
 65         /// <returns>结果</returns>
 66         private static Dictionary<string, Area> LoadProvinces(XmlNodeList provinceNodeList)
 67         {
 68             Dictionary<string, Area> result = new Dictionary<string, Area>();
 69             foreach (XmlNode provinceNode in provinceNodeList)
 70             {
 71                 string code = GetAttribute(provinceNode, "code");
 72                 string name = GetAttribute(provinceNode, "name");
 73                 Area province = new Area(code, name, null);
 74                 var cities = LoadCities(province, provinceNode.ChildNodes);
 75                 foreach (var city in cities)
 76                 {
 77                     province.AppendChild(city);
 78                 }
 79                 result.Add(code, province);
 80             }
 81             return result;
 82         }
 83 
 84         /// <summary>
 85         /// 加载城市
 86         /// </summary>
 87         /// <param name="province"></param>
 88         /// <param name="cityNodeList">节点</param>
 89         /// <returns>结果</returns>
 90         private static IEnumerable<Area> LoadCities(Area province, XmlNodeList cityNodeList)
 91         {
 92             List<Area> result = new List<Area>();
 93             if (cityNodeList != null)
 94             {
 95                 foreach (XmlNode cityNode in cityNodeList)
 96                 {
 97                     string code = GetAttribute(cityNode, "code");
 98                     string name = GetAttribute(cityNode, "name");
 99                     Area city = new Area(code, name, province);
100                     var counties = loadCounties(city, cityNode.ChildNodes);
101                     foreach (var county in counties)
102                     {
103                         city.AppendChild(county);
104                     }
105                     result.Add(city);
106                 }
107             }
108             return result;
109         }
110 
111         /// <summary>
112         /// 加载区域
113         /// </summary>
114         /// <param name="city"></param>
115         /// <param name="countyNodeList">节点</param>
116         /// <returns>结果</returns>
117         private static IEnumerable<Area> loadCounties(Area city, XmlNodeList countyNodeList)
118         {
119             List<Area> result = new List<Area>();
120             if (countyNodeList != null)
121             {
122                 foreach (XmlNode countyNode in countyNodeList)
123                 {
124                     string code = GetAttribute(countyNode, "code");
125                     string name = GetAttribute(countyNode, "name");
126                     Area county = new Area(code, name, city);
127                     result.Add(county);
128                 }
129             }
130             return result;
131         }
132 
133         /// <summary>
134         /// 获取节点属性
135         /// </summary>
136         /// <param name="node">node</param>
137         /// <param name="attributeName">attributeName</param>
138         /// <returns>结果</returns>
139         private static string GetAttribute(XmlNode node, string attributeName)
140         {
141             if (node.Attributes != null)
142             {
143                 XmlAttribute attribute = node.Attributes[attributeName];
144                 return attribute == null ? string.Empty : attribute.Value;
145             }
146             return string.Empty;
147         }
148 
149         /// <summary>
150         /// 获取区域信息
151         /// </summary>
152         /// <param name="areaCode">区域代码</param>
153         /// <returns>结果</returns>
154         public static AreaInformation GetArea(string areaCode)
155         {
156             Area targetArea = null;
157             if (!string.IsNullOrWhiteSpace(areaCode) && areaCode.Length == 6)
158             {
159                 string provinceCode = areaCode.Substring(0, 2);
160                 if (areas.ContainsKey(provinceCode))
161                 {
162                     var province = areas[provinceCode];
163                     string cityCode = areaCode.Substring(2, 2);
164                     if (province.ContainsChild(cityCode))
165                     {
166                         var city = province.GetChild(cityCode);
167                         string countyCode = areaCode.Substring(4);
168                         if (city.ContainsChild(countyCode))
169                         {
170                             targetArea = city.GetChild(countyCode);
171                         }
172                         else
173                         {
174                             targetArea = city;
175                         }
176                     }
177                     else if (province.ContainsChild(areaCode.Substring(2)))
178                     {
179                         targetArea = province.GetChild(areaCode.Substring(2));
180                     }
181                     else
182                     {
183                         targetArea = province;
184                     }
185                 }
186             }
187             return targetArea == null ? null : targetArea.ToAreaInformation();
188         }
189     }
190 
191     /// <summary>
192     /// 区域
193     /// </summary>
194     public class Area
195     {
196         /// <summary>
197         /// 子区域
198         /// </summary>
199         private readonly Dictionary<string, Area> childrenDic;
200 
201         /// <summary>
202         /// 区域集
203         /// </summary>
204         private readonly List<Area> childrenList;
205 
206         /// <summary>
207         /// Initializes a new instance of the <see cref="Area"/> class. 
208         /// </summary>
209         /// <param name="code">代码</param>
210         /// <param name="name">名称</param>
211         /// <param name="parent">父区域</param>
212         internal Area(string code, string name, Area parent)
213         {
214             this.Info = new CodeNameMapping(code, name);
215             this.Parent = parent;
216             this.childrenDic = new Dictionary<string, Area>();
217             this.childrenList = new List<Area>();
218         }
219 
220         /// <summary>
221         /// 代码名称映射信息
222         /// </summary>
223         public CodeNameMapping Info
224         {
225             get;
226             private set;
227         }
228 
229         /// <summary>
230         /// 父区域
231         /// </summary>
232         public Area Parent
233         {
234             get;
235             private set;
236         }
237 
238         /// <summary>
239         /// 子区域
240         /// </summary>
241         public ReadOnlyCollection<Area> Children
242         {
243             get
244             {
245                 return this.childrenList.AsReadOnly();
246             }
247         }
248 
249         /// <summary>
250         /// 区域集是否包含
251         /// </summary>
252         /// <param name="code">代码</param>
253         /// <returns>结果</returns>
254         internal bool ContainsChild(string code)
255         {
256             return this.childrenDic.ContainsKey(code);
257         }
258 
259         /// <summary>
260         /// 获取区域
261         /// </summary>
262         /// <param name="code">代码</param>
263         /// <returns>区域</returns>
264         internal Area GetChild(string code)
265         {
266             return this.childrenDic[code];
267         }
268 
269         /// <summary>
270         /// 父亲区域
271         /// </summary>
272         internal Area TopParent
273         {
274             get
275             {
276                 return this.Parent == null ? this : this.Parent.TopParent;
277             }
278         }
279 
280         /// <summary>
281         /// 添加子区域
282         /// </summary>
283         /// <param name="child">子节点</param>
284         internal void AppendChild(Area child)
285         {
286             if (!this.childrenDic.ContainsKey(child.Info.Code))
287             {
288                 this.childrenDic.Add(child.Info.Code, child);
289                 this.childrenList.Add(child);
290             }
291         }
292 
293         /// <summary>
294         /// 区域信息转化
295         /// </summary>
296         /// <returns>区域信息</returns>
297         internal AreaInformation ToAreaInformation()
298         {
299             CodeNameMapping province = this.TopParent.Info;
300             CodeNameMapping city = default(CodeNameMapping);
301             CodeNameMapping county = default(CodeNameMapping);
302             if (this.Parent != null)
303             {
304                 if (this.Parent.Info == province)
305                 {
306                     city = this.Info;
307                 }
308                 else
309                 {
310                     city = this.Parent.Info;
311                     county = this.Info;
312                 }
313             }
314             return new AreaInformation(province, city, county);
315         }
316     }
317 
318     /// <summary>
319     /// 区域信息
320     /// </summary>
321     public class AreaInformation
322     {
323         /// <summary>
324         /// Initializes a new instance of the <see cref="AreaInformation"/> class. 
325         /// </summary>
326         /// <param name="province"></param>
327         /// <param name="city"></param>
328         /// <param name="county"></param>
329         public AreaInformation(CodeNameMapping province, CodeNameMapping city, CodeNameMapping county)
330         {
331             this.Province = province;
332             this.City = city;
333             this.County = county;
334         }
335 
336         /// <summary>
337         /// 代码
338         /// </summary>
339         public string Code
340         {
341             get
342             {
343                 return this.Province.Code + this.City.Code + this.County.Code;
344             }
345         }
346 
347         /// <summary>
348         ///349         /// </summary>
350         public CodeNameMapping Province
351         {
352             get;
353             private set;
354         }
355 
356         /// <summary>
357         ///358         /// </summary>
359         public CodeNameMapping City
360         {
361             get;
362             private set;
363         }
364 
365         /// <summary>
366         ///367         /// </summary>
368         public CodeNameMapping County
369         {
370             get;
371             private set;
372         }
373 
374         /// <summary>
375         /// 名称
376         /// </summary>
377         public string FullName
378         {
379             get
380             {
381                 return this.Province.Name + this.City.Name + this.County.Name;
382             }
383         }
384 
385         /// <summary>
386         /// 重写ToString
387         /// </summary>
388         /// <returns>结果</returns>
389         public override string ToString()
390         {
391             return this.FullName;
392         }
393     }
394 
395     /// <summary>
396     /// 代码名称映射
397     /// </summary>
398     public struct CodeNameMapping
399     {
400         /// <summary>
401         /// 代码
402         /// </summary>
403         private readonly string code;
404 
405         /// <summary>
406         /// 名称
407         /// </summary>
408         private readonly string name;
409 
410         /// <summary>
411         /// Initializes a new instance of the <see cref="CodeNameMapping"/> struct. 
412         /// </summary>
413         /// <param name="code">代码</param>
414         /// <param name="name">名称</param>
415         internal CodeNameMapping(string code, string name)
416         {
417             this.code = code;
418             this.name = name;
419         }
420 
421         /// <summary>
422         /// 代码
423         /// </summary>
424         public string Code
425         {
426             get { return this.code; }
427         }
428 
429         /// <summary>
430         /// 名称
431         /// </summary>
432         public string Name
433         {
434             get { return this.name; }
435         }
436 
437         /// <summary>
438         /// 重写比较
439         /// </summary>
440         /// <param name="obj">对象</param>
441         /// <returns>结果</returns>
442         public override bool Equals(object obj)
443         {
444             if (obj != null && obj is CodeNameMapping)
445             {
446                 return ((CodeNameMapping)obj).Code == this.Code;
447             }
448             return false;
449         }
450 
451         /// <summary>
452         /// GetHashCode
453         /// </summary>
454         /// <returns>HashCode</returns>
455         public override int GetHashCode()
456         {
457             return this.Code.GetHashCode();
458         }
459 
460         /// <summary>
461         /// 相等比较器
462         /// </summary>
463         /// <param name="left">left</param>
464         /// <param name="right">right</param>
465         /// <returns>结果</returns>
466         public static bool operator ==(CodeNameMapping left, CodeNameMapping right)
467         {
468             return left.Code != right.Code;
469         }
470 
471         /// <summary>
472         /// 不相等比较器
473         /// </summary>
474         /// <param name="left">left</param>
475         /// <param name="right">right</param>
476         /// <returns>结果</returns>
477         public static bool operator !=(CodeNameMapping left, CodeNameMapping right)
478         {
479             return left.Code != right.Code;
480         }
481     }
482 }
View Code

 

xml配置文件

下载地址

 

测试方法

 

 1         private static void Validator()
 2         {
 3             // 正确的
 4             Validator v = new Validator("330719196804253671");
 5             var rel = v.Execute();
 6 
 7             // 错误的 更改第5位数
 8             Validator v1 = new Validator("330729196804253671");
 9             var rel1 = v1.Execute();
10         }
View Code

js验证点这里

posted @ 2015-05-27 16:23  刘小吉  阅读(1429)  评论(0编辑  收藏  举报