身份证号码查询与生成(C#源码)
项目要用到这个功能,就写了一个,完整类也就二百来行,很简单。可以在项目中用,也可以作为学习。
源码下载 http://yunpan.cn/cmQCSWkhDnZLJ 访问密码 0227
核心代码如下:
- using System;
- using System.Collections.Generic;
- using System.Collections;
- using System.Text;
- using System.Xml;
- using System.Text.RegularExpressions;
- using System.Globalization;
- using System.Web.Hosting;
- namespace IDCardNumber
- {
- /// <summary>
- /// 身份证号码解析与生成
- /// 作者:宋雷鸣 10522779@qq.com
- /// </summary>
- public class IDCardNumber
- {
- #region 身份证信息属性
- private string _province;
- /// <summary>
- /// 所在省份信息
- /// </summary>
- public string Province
- {
- get { return _province; }
- set { _province = value; }
- }
- private string _area;
- /// <summary>
- /// 所在地区信息
- /// </summary>
- public string Area
- {
- get { return _area; }
- set { _area = value; }
- }
- private string _city;
- /// <summary>
- /// 所在区县信息
- /// </summary>
- public string City
- {
- get { return _city; }
- set { _city = value; }
- }
- private DateTime _age;
- /// <summary>
- /// 年龄
- /// </summary>
- public DateTime Age
- {
- get { return _age; }
- set { _age = value; }
- }
- private int _sex;
- /// <summary>
- /// 性别,0为女,1为男
- /// </summary>
- public int Sex
- {
- get { return _sex; }
- set { _sex = value; }
- }
- private string _cardnumber;
- /// <summary>
- /// 身份证号码
- /// </summary>
- public string CardNumber
- {
- get { return _cardnumber; }
- set { _cardnumber = value; }
- }
- private string _json;
- /// <summary>
- /// 生成Javascript对象;
- /// </summary>
- public string Json
- {
- get { return _json; }
- set { _json = value; }
- }
- #endregion
- #region 静态方法
- private static readonly List<string[]> Areas = new List<string[]>();
- /// <summary>
- /// 获取区域信息
- /// </summary>
- private static void FillAreas()
- {
- XmlDocument docXml = new XmlDocument();
- string file = HostingEnvironment.MapPath("~/App_Data/AreaCodeInfo.xml");
- docXml.Load(file);
- XmlNodeList nodelist = docXml.GetElementsByTagName("area");
- foreach (XmlNode node in nodelist)
- {
- string code = node.Attributes["code"].Value;
- string name = node.Attributes["name"].Value;
- IDCardNumber.Areas.Add(new string[] { code, name });
- }
- }
- /// <summary>
- /// 解析身份证信息
- /// </summary>
- /// <param name="idCardNumber"></param>
- public static IDCardNumber Get(string idCardNumber)
- {
- if (IDCardNumber.Areas.Count < 1)
- IDCardNumber.FillAreas();
- if (!IDCardNumber.CheckIDCardNumber(idCardNumber))
- throw new Exception("非法的身份证号码");
- //
- IDCardNumber cardInfo = new IDCardNumber(idCardNumber);
- return cardInfo;
- }
- /// <summary>
- /// 校验身份证号码是否合法
- /// </summary>
- /// <param name="idCardNumber"></param>
- /// <returns></returns>
- public static bool CheckIDCardNumber(string idCardNumber)
- {
- //正则验证
- Regex rg = new Regex(@"^\d{17}(\d|X)$");
- Match mc = rg.Match(idCardNumber);
- if (!mc.Success) return false;
- //加权码
- string code = idCardNumber.Substring(17, 1);
- double sum = 0;
- string checkCode = null;
- for (int i = 2; i <= 18; i++)
- {
- sum += int.Parse(idCardNumber[18 - i].ToString(), NumberStyles.HexNumber) * (Math.Pow(2, i - 1) % 11);
- }
- string[] checkCodes ={ "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
- checkCode = checkCodes[(int)sum % 11];
- if (checkCode != code) return false;
- //
- return true;
- }
- /// <summary>
- /// 随机生成一个身份证号
- /// </summary>
- /// <returns></returns>
- public static IDCardNumber Radom()
- {
- long tick = DateTime.Now.Ticks;
- return new IDCardNumber(_radomCardNumber((int)tick));
- }
- /// <summary>
- /// 批量生成身份证
- /// </summary>
- /// <param name="count"></param>
- /// <returns></returns>
- public static List<IDCardNumber> Radom(int count)
- {
- List<IDCardNumber> list = new List<IDCardNumber>();
- string cardNumber;
- bool isExits;
- for (int i = 0; i < count; i++)
- {
- do
- {
- isExits = false;
- int tick = (int)DateTime.Now.Ticks;
- cardNumber = IDCardNumber._radomCardNumber(tick * (i + 1));
- foreach (IDCardNumber c in list)
- {
- if (c.CardNumber == cardNumber)
- {
- isExits = true;
- break;
- }
- }
- } while (isExits);
- list.Add(new IDCardNumber(cardNumber));
- }
- return list;
- }
- /// <summary>
- /// 生成随身份证号
- /// </summary>
- /// <param name="seed">随机数种子</param>
- /// <returns></returns>
- private static string _radomCardNumber(int seed)
- {
- if (IDCardNumber.Areas.Count < 1)
- IDCardNumber.FillAreas();
- System.Random rd = new System.Random(seed);
- //随机生成发证地
- string area = "";
- do
- {
- area = IDCardNumber.Areas[rd.Next(0, IDCardNumber.Areas.Count - 1)][0];
- } while (area.Substring(4, 2) == "00");
- //随机出生日期
- DateTime birthday = DateTime.Now;
- birthday = birthday.AddYears(-rd.Next(16, 60));
- birthday = birthday.AddMonths(-rd.Next(0, 12));
- birthday = birthday.AddDays(-rd.Next(0, 31));
- //随机码
- string code = rd.Next(1000, 9999).ToString("####");
- //生成完整身份证号
- string codeNumber = area + birthday.ToString("yyyyMMdd") + code;
- double sum = 0;
- string checkCode = null;
- for (int i = 2; i <= 18; i++)
- {
- sum += int.Parse(codeNumber[18 - i].ToString(), NumberStyles.HexNumber) * (Math.Pow(2, i - 1) % 11);
- }
- string[] checkCodes ={ "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
- checkCode = checkCodes[(int)sum % 11];
- codeNumber = codeNumber.Substring(0, 17) + checkCode;
- //
- return codeNumber;
- }
- #endregion
- #region 身份证解析方法
- private IDCardNumber(string idCardNumber)
- {
- this._cardnumber = idCardNumber;
- _analysis();
- }
- /// <summary>
- /// 解析身份证
- /// </summary>
- private void _analysis()
- {
- //取省份,地区,区县
- string provCode = _cardnumber.Substring(0, 2).PadRight(6, '0');
- string areaCode = _cardnumber.Substring(0, 4).PadRight(6, '0');
- string cityCode = _cardnumber.Substring(0, 6).PadRight(6, '0');
- for (int i = 0; i < IDCardNumber.Areas.Count; i++)
- {
- if (provCode == IDCardNumber.Areas[i][0])
- this._province = IDCardNumber.Areas[i][1];
- if (areaCode == IDCardNumber.Areas[i][0])
- this._area = IDCardNumber.Areas[i][1];
- if (cityCode == IDCardNumber.Areas[i][0])
- this._city = IDCardNumber.Areas[i][1];
- if (_province != null && _area != null && _city != null) break;
- }
- //取年龄
- string ageCode = _cardnumber.Substring(6, 8);
- try
- {
- int year = Convert.ToInt16(ageCode.Substring(0, 4));
- int month = Convert.ToInt16(ageCode.Substring(4, 2));
- int day = Convert.ToInt16(ageCode.Substring(6, 2));
- _age = new DateTime(year, month, day);
- }
- catch
- {
- throw new Exception("非法的出生日期");
- }
- //取性别
- string orderCode = _cardnumber.Substring(14, 3);
- this._sex = Convert.ToInt16(orderCode) % 2 == 0 ? 0 : 1;
- //生成Javascript对象
- _json = @"prov:'{0}',area:'{1}',city:'{2}',year:{3},month:{4},day:{5},sex:{6},number:'{7}'";
- _json = string.Format(_json, _province, _area, _city, _age.Year, _age.Month, _age.Day, _sex, _cardnumber);
- _json = "{" + _json + "}";
- }
- #endregion
- }
- }
身份证号码查询与生成(C#源码)的更多相关文章
- Android 身份证号码查询、手机号码查询、天气查询
1.基本信息 身份证号码查询:http://apistore.baidu.com/apiworks/servicedetail/113.html 手机号码:http://apistore.baidu. ...
- Google Protocol Buffers 快速入门(带生成C#源码的方法)
Google Protocol Buffers是google出品的一个协议生成工具,特点就是跨平台,效率高,速度快,对我们自己的程序定义和使用私有协议很有帮助. Protocol Buffers入门: ...
- 使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)
先讲一下简单工厂模式.工厂方法模式.抽象工厂模式的东西: 简单工厂模式(Simple Factory Pattern):工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,也就是说产品 ...
- Hibernate 5.x 生成 SessionFactory 源码跟踪分析
我们要使用 Hibernate 的功能,首先需要读取 Hibernate 的配置文件,根据配置启动 Hibernate ,然后创建 SessionFactory. 创建 SessionFactory ...
- VB版本查询快递单号源码
能查询各大快递单号,包括申通快递,圆通快递,韵达快递等国内超过90家以上快递单号查询, 如果想快速搭建一个快递单号查询站我推荐这个,这是地址www.aikuaidi.cn,我分享一个VB Functi ...
- 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码
此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考Which framework to generate source code ? - Cleancode and ...
- iOS雪花动画、音频图、新闻界面框架、2048游戏、二维码条形码扫码生成等源码
iOS精选源码 粒子雪花与烟花的动画 iOS 2048游戏 JHSoundWaveView - 简单地声波图.音波图 一个可快速集成的新闻详情界面框架,类似今日头条,腾讯新闻 二维码/条形码扫描及扫描 ...
- iOS运营级B2B服务平台App、自定义图标库、个人中心页面、识别身份证Demo、瀑布流等源码
iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 一个近乎完整的可识别中国身份证信息的Demo 可自动快速... iOS可自定义图表库 - PNChart 开源一款曾是运营级的B2B服务 ...
- vue-cli随机生成port源码
const portfinder = require('portfinder'): const port = await portfinder.getPortPromise(): 两行代码 端口搜索范 ...
随机推荐
- QQ邮箱发送邮件,出现mail from address must be same as authorization user错误
之前做的一个系统,有个发送邮件的功能,一直能正常使用,今天同事说QQ邮箱发送不了. 立马着手调试,发现服务器一直出现“mail from address must be same as authori ...
- gcc与gdb版本兼容问题
今天在用gdb调试C++程序的时候,想用"p i”命令打印出程序的一个局部变量i,却一直提示: No symbol "i" in current context. 我愣了 ...
- WIN7系统中设置默认登录用户
新建账户,如果不删除之前的账户,会每次登录都要选择一个账户登录系统,非常麻烦,而且之前的administrator账户不能删除. 单机开始菜单,选择运行,键入“control userpassword ...
- UML类图6种关系的总结
http://www.open-open.com/lib/view/open1328059700311.html
- 1500. Prime Gap 11 月 11日
/*本篇为转载,在此申明,具体就是先设定从2以后所有的数都为质数,定为质数的数的倍数则不是质数,慢慢排除后面的数*/ #include<iostream>#include<cstri ...
- Webservice 65535 错误
修改配置项: <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name=&qu ...
- Spring学习笔记 1. 尚硅谷_佟刚_Spring_HelloWorld
1,准备工作 (1)安装spring插件 搜索https://spring.io/tools/sts/all就可以下载最新的版本 下载之后不用解压,使用Eclipse进行安装.在菜单栏最右面的Help ...
- spring batch部分
引用高人的:http://kanpiaoxue.iteye.com/blog/1768887
- backbone框架思路
Backbone是MVC框架.如何使用这个框架来简化前端过程呢?作为一个初学者,虽然网上有它的官方文档,但是都是讲的一些方法,思路分析的却对初学者来说,看得晕乎乎的.现在就把自己对这个框架的理解记录在 ...
- php面向对象学习
近期跟着别人开发一套php程序,深感自己面向对象很白痴,于是再次巩固了一下面向对象的学习,自己整理了一下这几天面向对象的东西,给大家分享!! 面向对象的三大特性: 封装 -- 隐藏内部实现,稳定外部接 ...