C# 身份证号码15位和18位验证
/// <summary>
/// 身份证
/// </summary>
[Serializable]
public class IDCard
{
/// <summary>
/// 身份证号
/// </summary>
public string IDCardNum { get; set; }
/// <summary>
/// 行政区
/// </summary>
public string Canton { get; private set; }
/// <summary>
/// 出生日期
/// </summary>
public DateTime Birthday { get; private set; }
/// <summary>
/// 性别(0-女;1-男)
/// </summary>
public int Gander { get; private set; }
/// <summary>
/// 是否为合法身份证号
/// </summary>
public bool IsIDCard { get; private set; } public IDCard() { } public IDCard(string IDnumber)
{
this.IDCardNum = IDnumber;
} /// <summary>
///
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
public static IDCard Parse(string number)
{
IDCard idCard = new IDCard(number); const int s5bits = 15;
const int s8bits = 18; #region 15位
if (number.Length == s5bits) //15位的处理
{
//检查输入是否为数字
for (int i = 0; i < number.Length; i++)
{
if ((number[i] < '0') || (number[i] > '9'))
{
throw new FormatException("身份证号错误");
}
} //出生日期
string birthday = "19" + number.Substring(6, 6);
string year = birthday.Substring(0, 4);
string month = birthday.Substring(4, 2);
string day = birthday.Substring(6, 2);
birthday = string.Format("{0}-{1}-{2}", year, month, day); DateTime date = new DateTime();
if (DateTime.TryParse(birthday, out date))
{
idCard.Birthday = date;
}
else
{
throw new InvalidCastException("身份证号出生日期错误");
}
//性别
if ((number[s5bits - 1] == '0') || (number[s5bits - 1] % 2 == 0))
{
idCard.Gander = 0; // 女
}
else
{
idCard.Gander = 1; // 男
} idCard.IsIDCard = true;
return idCard;
}
#endregion #region 18位
else if (number.Length == s8bits) //18位的处理
{
// 检查前17位是否为数字
for (int i = 0; i < number.Length -1; i++)
{
if ((number[i] < '0') || (number[i] > '9'))
{
throw new FormatException("身份证号错误");
}
} char end = number[s8bits - 1]; //最后一位 //最后1位是x转成大写X
if (end == 'x')
{
end = 'X';
number = number.Substring(0, s8bits - 1) + end;
} if (!(end == 'X' || (end >= '0' && end <= '9')))
{
throw new FormatException("身份证号错误");
}
/// 校验
int num = 0;
char proof;
for (int i = 17; i > 0; i--)
{
num = num + (int)(Math.Pow(2, i) % 11) * (number[17 - i] - 48);
}
num %= 11;
switch (num)
{
case 0:
proof = '1';
break;
case 1:
proof = '0';
break;
case 2:
proof = 'X';
break;
default:
proof = (char)(12 - num + 48);
break;
} if (end != proof) //最后一位与校验码不符
{
throw new FormatException("身份证号错误");
} //出生日期
string birthday = number.Substring(6, 8);
string year = birthday.Substring(0, 4);
string month = birthday.Substring(4, 2);
string day = birthday.Substring(6, 2);
birthday = string.Format("{0}-{1}-{2}", year, month, day); DateTime date = new DateTime();
if (DateTime.TryParse(birthday, out date))
{
idCard.Birthday = date;
}
else
{
throw new InvalidCastException("身份证号出生日期错误");
} //行政区
idCard.Canton = number.Substring(0, 6); //性别
if ((number[16] == '0') || (number[16] % 2 == 0))
{
idCard.Gander = 0; //女
}
else
{
idCard.Gander = 1; //男
} idCard.IsIDCard = true;
return idCard;
}
#endregion
else
{
throw new FormatException("无效的身份证号码位数:" + number.Length);
}
} public static bool TryParse(string number, out IDCard card)
{
IDCard idCard = null;
bool isIdCard = true;
try
{
Parse(number);
}
catch (Exception)
{
isIdCard = false;
}
card = idCard;
return isIdCard;
}
}
C# 身份证号码15位和18位验证的更多相关文章
- 做一个牛XX的身份证号验证类(支持15位和18位)
原文:做一个牛XX的身份证号验证类(支持15位和18位) #region 是否合法的中国身份证号码 protected bool IsChineseID() { if (str.Length == 1 ...
- java中身份证号15位转18位
/** * 将15位转换为18位 * @param idCode 15位身份证号 * @return String 18位身份证号 */ public String toEighteen(String ...
- php提取身份证号码中的生日日期以及验证是否为未成年人的函数
php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位 ...
- 身份证号码15位转18位 C#实现
[身份证最后一位神秘X的由来]身份证中的“冷知识”1999年的今天,<国务院关于实行公民身份号码制度的决定>被发布,当年10月1日实施.为什么有的有X?这位数是根据前17位计算出的校验码. ...
- java 身份证15位转18位
/** * 根据身份证号获取性别 * * @param pid * 身份证号 * @return 性别 F为女M为男 */ public static String getSexByPid(Strin ...
- php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用
//验证身份证是否有效 function validateIDCard($IDCard) { if (strlen($IDCard) == 18) { return check18IDCard($ID ...
- 16Aspx.com-将15位身份证转换成18位
//********************************************************************************* //将15位身份证转换成18位时 ...
- Js完美验证15/18身份证,Js验证身份证,支持15/18位
Js完美验证15/18身份证,Js验证身份证,支持15/18位 >>>>>>>>>>>>>>>>> ...
- js验证15位或18位身份证
本篇文章是本人在网上搜集了一些验证,然后又个人进行一定修改的关于身份证的验证,欢迎修改指正..... function IdCardValidateRule(idCard) { var tip; ...
随机推荐
- mysql Waiting for table flush
应用突然被hang住了,tomcat日志报错,所有涉及到数据库的操作都报错,卡死. show processlist 查看到大量的:Waiting for table flush 应该是 进行了 dd ...
- 2018710101021-王方-《面向对象(java)程序设计》第十一周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- hbase配置hdfs的HA之后需要修改的路径
hbase-site.xml中配置了hdfs的一个路径 <property> <name>hbase.rootdir</name> <value>hdf ...
- 不使用已下载的package pip 安装 & 出现time out error
pip install XX + --no-cache-dir 安装出现time out error时: pip --default-timeout=10000 install XX
- python之路—从入门到放弃
python基础部分 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 内置函数和匿名函数 递归函数 常用模块 常用模块 模块和包 面向对象 初识面向对象 面向对象进阶 网络编程 网络编程 并发编 ...
- springboot启动时控制台不显示映射的URL
背景 今天,第一次使用 2.2.0 版本的springboot,在访问接口时发现访问不到,于是在控制台进行 URL 搜索,发现并相关没有内容 原因 springboot版本差异,切换回 2.0.5.R ...
- Linux配置DHCP服务器,DHCP中继配置
配置dhcp服务器 第一步:配置网卡 第二步: 安装dhcp (需要先构建yum仓库,构建yum仓库的方法在之前的博客里有) 编写dhcp.conf文件 进去以后会出现这个内容 需要执行下面的内容将内 ...
- Codechef Chef Cuts Tree
该思博的时候就思博到底,套路的时候不能再套路的一道题 首先我们将联通块的大小平方和进行转化,发现它就等价于连通点对数,而这个可以转化为连接两点的边数(距离)和 所以我们考虑第\(i\)天时,一个点对\ ...
- 8.9 NOIP模拟测试15 建设城市(city)+轰炸行动(bomb)+石头剪刀布(rps)
鉴于T3的惨烈程度,我决定先来颓篇题解. T1 建设城市(city) 挡板法+容斥 m个建设队分成n组,每组必须有一个,先不考虑上限,共有 C(m-1,n-1)种方案. 有i个组是超过k个的,容斥掉 ...
- [LeetCode] 493. Reverse Pairs 翻转对
Given an array nums, we call (i, j) an important reverse pair if i < j and nums[i] > 2*nums[j] ...