1. 中国公民身份证常识:
我国现行使用公民身份证号码有两种尊循两个国家标准,〖GB 11643-1989〗和〖GB 11643-1999〗。
〖GB 11643-1989〗中规定的是15位身份证号码:排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。
〖GB 11643-1999〗中规定的是18位身份证号码:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
6位行政区划分代码
|
6位出生日期
|
3位顺序码
|
1位校验码
|
行政区划分代码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
行政区划分代码【国家标准GB T 2260-1999】
出生日期码:表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
顺序码:表示同一地址码所标识的区域范围内,对同年、同月、同日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。
校验码:是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
ISO 7064:1983.MOD 11-2校验码计算法
按照中华人民共和国国家标准GB11643-1999规定中华人民共和国公民身份号码校验码的计算方法即为ISO 7064:1983.MOD 11-2校验码计算法。
假设某一17位数字是
17位数字 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
加权因子 |
2 |
4 |
8 |
5 |
10 |
9 |
7 |
3 |
6 |
1 |
2 |
4 |
8 |
5 |
10 |
9 |
7 |
- 计算17位数字各位数字与对应的加权因子的乘积的和S:1×2+2×4+3×8+4×5+5×10+6×9+7×7+8×3+9×6+0×1+1×2+2×4+3×8+4×5+5×10+6×9+7×7=492;
- 计算S÷11的余数T:492 mod 11=8;
- 计算(12-T)÷11的余数R,如果R=10,校验码为字母“X”;如果R≠10,校验码为数字“R”:(12-8)mod 11=4。
该17位数字的校验码就是4,聚合在一为123456789012345674。
package id_card;
import string_util.StringUtil;
/**
* 身份证号码验证小程序
* @author Kevin
* 2010-3-28
*/
public class IdCardUtil {
/** 旧身份证号码位数(完全有数字组成) */
public static final int OLD_IDCARD_LEN=15;
/** 新身份证号码位数 */
public static final int NEW_IDCARD_LEN=18;
/** 存放位权值数组 */
private static int[] wi=new int[17];
/**最小行政区划分代码*/
private final static int MINCODE = 110000;
/**最大行政区划分代码*/
private final static int MAXCODE = 820000;
/** 求模参数 */
private final static int MODE=11;
/** 新身份证年份标记 */
private final static String YEAR_FLAG="19";
/**
* 设置位权值
*/
private static void setWiValue(){
for(int i=0;i<wi.length;i++){
int k=(int)Math.pow(2, (wi.length-i));
wi[i]=k%MODE;
}
}
/**
* 依据新身份证号码前17为数字,得到最后一位验证码
* @param checkString
* @return
*/
private static String getCheckCode(String checkString){
int sum=0;
setWiValue();//设置位权值
for(int i=0;i<checkString.length();i++){
int k=StringUtil.convertInteger(String.valueOf(checkString.charAt(i)))*wi[i];
sum+=k;
}
int num=(12-(sum%MODE))%MODE;
if(num==10){
return "X";
}else{
return String.valueOf(num);
}
}
/**
* 验证身份证号码行政区划分代码是否有效
* @param idCard
* @return
*/
public static boolean isValidateCantonCode(String idCard) throws Exception{
String cantonCode=idCard.substring(0,6);
int code=StringUtil.convertInteger(cantonCode);
if(code>=MINCODE && code<=MAXCODE){
return true;
}
return false;
}
/**
* 验证新身份证最后一位是否有效
* @param lastLetter
* @return
*/
private static boolean isValidateLastCode(String lastCode){
//是否是数字、'x'或'X'
if(StringUtil.isCompleteNumberString(lastCode)||lastCode.equalsIgnoreCase("x")){
return true;
}
return false;
}
/**
* 验证身份证是否有效
* @param idCard
* @return
*/
public static boolean isValidateIdCard(String idCard) throws Exception{
//验证是否是过有效字符串
if(!StringUtil.isValidateString(idCard)){
return false;
}
//去除前后空格
idCard=idCard.trim();
//验证身份证号码是不是15位或18位
if(idCard.length()!=OLD_IDCARD_LEN && idCard.length()!=NEW_IDCARD_LEN){
return false;
}
//验证身份证号码行政区划分代码是否有效
if(!isValidateCantonCode(idCard)){
return false;
}
//身份证生日号码
String birthday="";
if(idCard.length()==OLD_IDCARD_LEN){
if(StringUtil.isCompleteNumberString(idCard)){
birthday=YEAR_FLAG+idCard.substring(6,12);
}
}else{
if(StringUtil.isCompleteNumberString(idCard.substring(0,17))){
if(isValidateLastCode(idCard.substring(17, idCard.length()))){
birthday=idCard.substring(6, 14);
}
}
}
//验证生日日期格式是否有效
if(!StringUtil.isValidateDateString(birthday, "yyyyMMdd")){
return false;
}
//验证新身份证最后一位是否有效
if(idCard.length()==NEW_IDCARD_LEN){
String lastCode=getCheckCode(idCard.substring(0,17));
if(!(String.valueOf(idCard.charAt(17)).equalsIgnoreCase(lastCode))){
return false;
}
}
return true;
}
/**
* 将旧身份证号码转化为新身份证号码
* @param code
* @return
* @throws Exception
*/
public static String oldCard2newCarid(String oldIdCard) throws Exception{
if(!StringUtil.isValidateString(oldIdCard)){
return "";
}
oldIdCard=oldIdCard.trim();
if(oldIdCard.length()!=OLD_IDCARD_LEN||!isValidateIdCard(oldIdCard)){
return "";
}
oldIdCard=oldIdCard.substring(0,6)+YEAR_FLAG+oldIdCard.substring(6);
oldIdCard=oldIdCard+getCheckCode(oldIdCard);
return oldIdCard;
}
/**
* 测试
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception{
System.out.println(IdCardUtil.isValidateIdCard("000000000000000000"));
}
}
package string_util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public final class StringUtil{
/**
* 字符串数组合并
* @param stringAry 字符串数组
* @param joinToken 分隔符
* @return 合并后的字符串
*/
public static String join(String []stringAry,String joinToken){
if(stringAry==null||stringAry.length<=0){
return null;
}
if(joinToken==null||joinToken.equalsIgnoreCase("null")){
joinToken="";
}
joinToken=joinToken.trim();
StringBuffer sb=new StringBuffer();
for(int i=0;i<stringAry.length;i++){
if(i>0){
sb.append(joinToken);
}
sb.append(stringAry[i]);
}
return sb.toString();
}
/**
* 将整数字符串转化为整数
* @param str 数字字符串
* @return 转化后的Int类型
* @throws NumberFormatException
*/
public static int convertInteger(String str) throws NumberFormatException{
int number=0;
if(!isValidateString(str)){
return number;
}
str=str.trim();
try {
number=Integer.parseInt(str);
} catch (NumberFormatException e) {
throw e;
}
return number;
}
/**
* 将浮点数的字符串转化为浮点数
* @param str 要转化的字符串
* @return 转化后的浮点数
* @throws NumberFormatException
*/
public static float convertFloat(String str)throws NumberFormatException{
float number=0.0f;
if(!isValidateString(str)){
return number;
}
str=str.trim();
try {
number=Float.parseFloat(str);
} catch (NumberFormatException e) {
throw e;
}
return number;
}
/**
* 将双精度浮点数的字符串转化为双精度浮点数
* @param str 要转化的字符串
* @return 转化后的值
* @throws NumberFormatException
*/
public static double convertDouble(String str)throws NumberFormatException{
double number=0.0;
if(!isValidateString(str)){
return number;
}
str=str.trim();
try {
number=Double.parseDouble(str);
} catch (NumberFormatException e) {
throw e;
}
return number;
}
/**
* 验证字符串合法性(即该字符串不可以为null)
* 该方法不除去字符串中空格
* @param str String
* @return 如果为空就返回""
*/
public static String CheckString(String str){
if(str==null||str.equalsIgnoreCase("null")){
return "";
}
/**
* 除去前后的空格
*/
return str.trim();
}
/**
* 验证字符串合法性(该字符串可以为null)
* 该方法不除去字符串中空格
* @param str String
* @return 如果为空就返回""
*/
public static String ValidateString(String str){
if(str==null){
return "";
}
/**
* 除去前后的空格
*/
return str.trim();
}
/**
* 验证是否是个有效字符串
* @param str
* @return
*/
public static boolean isValidateString(String str){
if(str==null){
return false;
}
if(str.trim().equals("")){
return false;
}
if(str.equalsIgnoreCase("null")){
return false;
}
return true;
}
/**
* 从当前字符串中某个字符开始截取字符串
* @param str String
* @param singleChar String字符标记
* @param front boolean 如果值为true表式截取标记字符前面的字符,反之相反
* @return 截取后字符串
*/
public static String cutString(String str,String singleChar,boolean front){
if(!isValidateString(str)){
return "";
}
if(!isValidateString(singleChar)){
return "";
}
str=str.trim();
singleChar=singleChar.trim();
if(str.contains(singleChar)){
int index=str.indexOf(singleChar);
if(front){
return str.substring(0,index);
}else{
return str.substring(index+1,str.length());
}
}else{
return str;
}
}
/**
* 将数据库中取出以字符串形式表示的日期
* 转化为:1999-09-09日期格式形式
* @param dbStr String
* @return String 转化后的字符串
*/
public static String toDateString(String dbStr){
if(!isValidateString(dbStr)){
return "";
}
dbStr=dbStr.trim();
return dbStr.substring(0,10);
}
/**
* 将字符串一个字母转换为大写
* @param name
* @return
*/
public static String toUpperCaseFirstLetter(String name){
if(!isValidateString(name)){
return "";
}
name=name.trim();
if(name.length()>0){
return name.substring(0,1).toUpperCase()+name.substring(1);
}
return "";
}
/**
* 将JavaBean属性名转化为其set和get方法名称
* 其转化规则如下:(1)属性名的第二个字母若为大写则不用将首字母转换为大写
* @param prppertyName
* @return
*/
public static String toJavaBeanPropertyForSetOrGetMethodName(String propertyName){
if(!isValidateString(propertyName)){
return "";
}
propertyName=propertyName.trim();
if(propertyName.length()<=1){
return propertyName.toUpperCase();
}else{
char secondLetter=propertyName.charAt(1);
if(secondLetter>='A'&& secondLetter<='Z'){
return propertyName;
}else{
return toUpperCaseFirstLetter(propertyName);
}
}
}
/**
* 将日期字符串转换为日期对象
* @param dateString
* @return
* @throws ParseException
*/
public static Date toStringForDate(String dateString) throws Exception{
Date date=null;
if(!isValidateString(dateString)){
throw new Exception("非日期格式字符串");
}
dateString=dateString.trim();
DateFormat format=DateFormat.getDateInstance();
try {
date=format.parse(dateString);
} catch (ParseException e) {
throw e;
}
return date;
}
/**
* 验证字符串是不是完全有数字和小数点组成
* 此方法还不可以验证16进制和八进制的数据
* @param number
* @return
*/
public static boolean isNumberString(String number){
if(!isValidateString(number)){
return false;
}
number=number.trim();
char[] nums=number.toCharArray();
for(int i=0;i<nums.length;i++){
if((nums[i]>='0'&& nums[i]<='9')||(nums[i]=='.')){
continue;
}else{
return false;
}
}
return true;
}
/**
* 验证字符串是不是完全有数字组成
* @param number
* @return
*/
public static boolean isCompleteNumberString(String number){
if(!isValidateString(number)){
return false;
}
number=number.trim();
char[] nums=number.toCharArray();
for(int i=0;i<nums.length;i++){
if((nums[i]<'0'|| nums[i]>'9')){
return false;
}
}
return true;
}
/**
* 验证日期格式字符串是否和指定样式匹配
* @param date
* @param style 指定样式
* @return
* @throws Exception
*/
public static boolean isValidateDateString(String dateStr,String style) throws Exception{
if(!isValidateString(style)){
return false;
}
if(!isValidateString(dateStr)){
return false;
}
Date date=null;
try{
SimpleDateFormat sdf=new SimpleDateFormat(style);
date =sdf.parse(dateStr);
}catch(Exception e){
throw e;
}
if(date==null){
return false;
}
return true;
}
/**
* 测试方法
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception{
// System.out.println(StringUtil.toJavaBeanPropertyForSetOrGetMethodName("aBc"));
if(StringUtil.isValidateDateString("19860912","yyyyMMdd")){
System.out.println("yes");
}else{
System.out.println("no");
}
}
}
分享到:
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
MMC整流器技术解析:基于Matlab的双闭环控制策略与环流抑制性能研究,Matlab下的MMC整流器技术文档:18个子模块,双闭环控制稳定直流电压,环流抑制与最近电平逼近调制,优化桥臂电流波形,高效并网运行。,MMC整流器(Matlab),技术文档 1.MMC工作在整流侧,子模块个数N=18,直流侧电压Udc=25.2kV,交流侧电压6.6kV 2.控制器采用双闭环控制,外环控制直流电压,采用PI调节器,电流内环采用PI+前馈解耦; 3.环流抑制采用PI控制,能够抑制环流二倍频分量; 4.采用最近电平逼近调制(NLM), 5.均压排序:电容电压排序采用冒泡排序,判断桥臂电流方向确定投入切除; 结果: 1.输出的直流电压能够稳定在25.2kV; 2.有功功率,无功功率稳态时波形稳定,有功功率为3.2MW,无功稳定在0Var; 3.网侧电压电流波形均为对称的三相电压和三相电流波形,网侧电流THD=1.47%<2%,符合并网要求; 4.环流抑制后桥臂电流的波形得到改善,桥臂电流THD由9.57%降至1.93%,环流波形也可以看到得到抑制; 5.电容电压能够稳定变化 ,工作点关键词:MMC
Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构,Simulink建模,MPPT最大功率点追踪,扰动观察法采用功率反馈方式,若ΔP>0,说明电压调整的方向正确,可以继续按原方向进行“干扰”;若ΔP<0,说明电压调整的方向错误,需要对“干扰”的方向进行改变。 ,Boost升压;光伏并网结构;Simulink建模;MPPT最大功率点追踪;扰动观察法;功率反馈;电压调整方向。,光伏并网结构中Boost升压MPPT控制策略的Simulink建模与功率反馈扰动观察法
STM32F103C8T6 USB寄存器开发详解(12)-键盘设备
科技活动人员数专指直接从事科技活动以及专门从事科技活动管理和为科技活动提供直接服务的人员数量
Matlab Simulink仿真探究Flyback反激式开关电源性能表现与优化策略,Matlab Simulink仿真探究Flyback反激式开关电源的工作机制,Matlab Simulimk仿真,Flyback反激式开关电源仿真 ,Matlab; Simulink仿真; Flyback反激式; 开关电源仿真,Matlab Simulink在Flyback反激式开关电源仿真中的应用
基于Comsol的埋地电缆电磁加热计算模型:深度解析温度场与电磁场分布学习资料与服务,COMSOL埋地电缆电磁加热计算模型:温度场与电磁场分布的解析与学习资源,comsol 埋地电缆电磁加热计算模型,可以得到埋地电缆温度场及电磁场分布,提供学习资料和服务, ,comsol;埋地电缆电磁加热计算模型;温度场分布;电磁场分布;学习资料;服务,Comsol埋地电缆电磁加热模型:温度场与电磁场分布学习资料及服务
1、文件内容:ibus-table-chinese-yong-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-yong-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
基于51单片机protues仿真的汽车智能灯光控制系统设计(仿真图、源代码) 一、设计项目 根据本次设计的要求,设计出一款基于51单片机的自动切换远近光灯的设计。 技术条件与说明: 1. 设计硬件部分,中央处理器采用了STC89C51RC单片机; 2. 使用两个灯珠代表远近光灯,感光部分采用了光敏电阻,因为光敏电阻输出的是电压模拟信号,单片机不能直接处理模拟信号,所以经过ADC0832进行转化成数字信号; 3. 显示部分采用了LCD1602液晶,还增加按键部分电路,可以选择手自动切换远近光灯; 4. 用超声模块进行检测距离;
altermanager的企业微信告警服务
MyAgent测试版本在线下载
Comsol技术:可调BIC应用的二氧化钒VO2材料探索,Comsol模拟二氧化钒VO2的可调BIC特性研究,Comsol二氧化钒VO2可调BIC。 ,Comsol; 二氧化钒VO2; 可调BIC,Comsol二氧化钒VO2材料:可调BIC技术的关键应用
C++学生成绩管理系统源码
基于Matlab与Cplex的激励型需求响应模式:负荷转移与电价响应的差异化目标函数解析,基于Matlab与CPLEX的激励型需求响应负荷转移策略探索,激励型需求响应 matlab +cplex 激励型需求响应采用激励型需求响应方式对负荷进行转移,和电价响应模式不同,具体的目标函数如下 ,激励型需求响应; matlab + cplex; 负荷转移; 目标函数。,Matlab与Cplex结合的激励型需求响应模型及其负荷转移策略
scratch介绍(scratch说明).zip
内容概要:本文全面介绍了深度学习模型的概念、工作机制和发展历程,详细探讨了神经网络的构建和训练过程,包括反向传播算法和梯度下降方法。文中还列举了深度学习在图像识别、自然语言处理、医疗和金融等多个领域的应用实例,并讨论了当前面临的挑战,如数据依赖、计算资源需求、可解释性和对抗攻击等问题。最后,文章展望了未来的发展趋势,如与量子计算和区块链的融合,以及在更多领域的应用前景。 适合人群:对该领域有兴趣的技术人员、研究人员和学者,尤其适合那些希望深入了解深度学习原理和技术细节的读者。 使用场景及目标:①理解深度学习模型的基本原理和结构;②了解深度学习模型的具体应用案例;③掌握应对当前技术挑战的方向。 阅读建议:文章内容详尽丰富,读者应在阅读过程中注意理解各个关键技术的概念和原理,尤其是神经网络的构成及训练过程。同时也建议对比不同模型的特点及其在具体应用中的表现。
该文档提供了一个关于供应链管理系统开发的详细指南,重点介绍了项目安排、技术实现和框架搭建的相关内容。 文档分为以下几个关键部分: 项目安排:主要步骤包括搭建框架(1天),基础数据模块和权限管理(4天),以及应收应付和销售管理(5天)。 供应链概念:供应链系统的核心流程是通过采购商品放入仓库,并在销售时从仓库提取商品,涉及三个主要订单:采购订单、销售订单和调拨订单。 大数据的应用:介绍了数据挖掘、ETL(数据抽取)和BI(商业智能)在供应链管理中的应用。 技术实现:讲述了DAO(数据访问对象)的重用、服务层的重用、以及前端JS的继承机制、jQuery插件开发等技术细节。 系统框架搭建:包括Maven环境的配置、Web工程的创建、持久化类和映射文件的编写,以及Spring配置文件的实现。 DAO的需求和功能:供应链管理系统的各个模块都涉及分页查询、条件查询、删除、增加、修改操作等需求。 泛型的应用:通过示例说明了在Java语言中如何使用泛型来实现模块化和可扩展性。 文档非常技术导向,适合开发人员参考,用于构建供应链管理系统的架构和功能模块。
这份长达104页的手册由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队精心编撰,内容详尽,覆盖了从基础概念、技术原理到实战案例的全方位指导。它不仅适合初学者快速了解DeepSeek的基本操作,也为有经验的用户提供了高级技巧和优化策略。
主题说明: 1、将mxtheme目录放置根目录 | 将mxpro目录放置template文件夹中 2、苹果cms后台-系统-网站参数配置-网站模板-选择mxpro 模板目录填写html 3、网站模板选择好之后一定要先访问前台,然后再进入后台设置 4、主题后台地址: MXTU MAX图图主题,/admin.php/admin/mxpro/mxproset admin.php改成你登录后台的xxx.php 5、首页幻灯片设置视频推荐9,自行后台设置 6、追剧周表在视频数据中,节目周期添加周一至周日自行添加,格式:一,二,三,四,五,六,日
运行GUI版本,可二开