身份证号码查询与生成(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(): 两行代码 端口搜索范 ...
随机推荐
- 多层嵌套ajax同步
方式一: $.ajax({ type : "post", url : "user/add", data : data, async : false, //必须为 ...
- 在rails中 Rendering Partials through Ajax
之前做.net的时候,自己做了一个showcontent的插件,用来加载页面的局部partial 之前采用的是ashx的方式 但rails里面不太方面,今天找到一个比较好的方法,试验成功 起初网上找到 ...
- Python小练习三
# 检查用户名和PIN码 database = [ ['], ['], ['], ['] ] username = input('User name:') pin = input('PIN code: ...
- Coursera Robotics系列课心得
Robotics Perception Professor Kostas and Jianbo Shi week 1: camera model 凸透镜成像原理:凸透镜焦点与焦距是固定的,这是物理性质 ...
- Springmvc中@RequestParam传值中文乱码解决方案
首先jsp表单里面有一些参数要传到controller中,通过以下方法接收: @RequestMapping(value="/orderPaper") public ModelAn ...
- Redis第二篇(Redis基本命令)
-x 从标准输入读取一个参数 such as: echo –en “shaw” |./redis-cli –x setname == set name shaw -r 重复执行一个命令 ...
- Spring Web
Spring MVC的初始化: WEB容器加载后,通过使用DispatcherServlet拦截器加载IOC容器到WEB容器中,并通过ContextLoderListener将其初始化, 因为Spri ...
- android5.0 aosp编译记录(由于机器硬件原因,改为4.4.2编译通过)
编译环境必须是64位系统啊,妥妥的又装了64位的ubuntu,虚拟机推荐server版本,不带x省性能…… 接着要装openjdk 1.7,记得更新一下系统的源,下面这个不错 deb http://m ...
- cocos2d-x 3.0 版本 骨骼动画设置shader
因为骨骼动画是由多个sprite组成, 所以需要遍历每个sprite 才能修改整体, 开头这样设置,在游戏中发现走路状态没问题,攻击状态就有部分sprite没效果 for (auto & ob ...
- 甲乙(数理逻辑)转自http://www.cnblogs.com/devymex/p/3329635.html
这是一道历史悠久,又很困难的面试题. 你在旁观主持人和甲.乙两个天才数学家玩猜数字游戏.主持人准备了两个数,告知甲乙:这两个数不同,且大于等于1,小于等于30.然后主持人将两数之积告诉甲,把两数之和告 ...