package com.work.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* @author cuiwx
* wangmj整理优化。
*
*/
public class IdCard {
// 经过计算得出的指数数组,算法:2的n-1次方求和,除以11取模
// 如:2的0次方除以11取模=1,2的1次方除以11取模=2,2的2次方除以11取模=4
static int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 校验位数组
static char[] ai = { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' };
public static void main(String args[]) {
// IdCard ic = new IdCard();
// System.currentTimeMillis();
try {
boolean flag = false;
while (flag) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("15位身份证号:");
String lowerid = reader.readLine();
if (lowerid.equals("quit")) {
System.out.println("bye~~");
break;
}
System.out.println("8位出生日期(19791216):");
String birth = reader.readLine();
System.out.println("请输入性别");
String sex = reader.readLine();
System.out.println(checkIdNumber(lowerid, birth, sex));
System.out.println("18位号:" + upperIdNumber(lowerid, birth));
System.out.println(checkIdNumber(upperIdNumber(lowerid, birth),
birth, sex));
}
} catch (Exception e) {
System.out.println(e);
}
}
/**
* 根据15位身份证号和出生日期计算得出18位身份证号
*
* @param lowerId,15位身份证号
* @param birthday出生日期,19810912
* @return upperId,返回18位身份证号
*/
public static String upperIdNumber(String lowerId, String birthday) {
if (lowerId.length() != 15) {
return "请录入15位身份证号码。";
} else {
return lowerId.substring(0, 6) + birthday.substring(0, 2)
+ lowerId.substring(6) + ai[checkBit(lowerId, birthday)];
}
// return lowerId+ai[checkBit("372832198109126616")];
}
/**
* 根据15位身份证号和出生日期,计算校验位
*
* @param lowerId,15位身份证号
* @param birthday出生日期,19810912
* @return mod,第18位校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod]
*/
public static int checkBit(String lowerId, String birthday) {
if (lowerId.length() != 15)// 请录入15位身份证号码
return -1;
lowerId = lowerId.substring(0, 6) + birthday.substring(0, 2)
+ lowerId.substring(6);
int sum = 0;
// 计算校验位,前 17位加权求和,然后除以11取模
for (int i = 1; i < lowerId.length() + 1; i++) {
sum = sum + wi[i - 1]
* (Integer.parseInt(lowerId.substring(i - 1, i)));
}
// System.out.println("sum = " + sum);
// 计算校验位end
int mod = sum % 11;
return mod;
}
/**
* 根据传入的18位身份证号,计算校验位
*
* @param id,18位身份证号
* @return mod,返回校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod]
*/
public static int checkBit(String id) {
String lowerId = id.substring(0, 17);
int sum = 0;
for (int i = 1; i < lowerId.length() + 1; i++) {
sum = sum + wi[i - 1]
* (Integer.parseInt(lowerId.substring(i - 1, i)));
}
int mod = sum % 11;
return mod;
}
/**
* 校验身份证号
*
* @param id
* 身份证号,包括15位和18位
* @param birthday出生日期8位(20071207)
* @param sex,性别,男为奇数,女为偶数
* @return result,返回身份证号是否正确
*/
public static String checkIdNumber(String id, String birthday, String sex) {
String result = "";
int len = id.length();
if (len == 15) {
// 调用15位身份证号校验方法
result = checkId_15(id, birthday, sex);
// System.out.println("15位---------------");
} else if (len == 18) {
// 调用18位身份证号校验方法
result = checkId_18(id, birthday, sex);
// System.out.println("18位---------------");
} else {
result = "false|身份证号长度错误,只能是15位或18位。";
}
return result;
}
/**
* 校验15位身份证号
*
* @param id
* 15位身份证号
* @param birthday出生日期8位(20071207)
* @param sex,性别,男为奇数,女为偶数
* @return result
*/
public static String checkId_15(String id, String birthday, String sex) {
String result = "";
String birth_id = id.substring(6, 12);// 6位日期
String birth = birthday.substring(2);
if (birth_id.equals(birth)) {
// 检验日期,出生日期与身份证中的出生日期相符,然后检验性别
if (sex.equals("男")) {
// 性别为男,最后一位是奇数
String temp = id.substring(14);// 最后一位代表性别
int isex = Integer.parseInt(temp);
if (isex % 2 == 1) {// 除2余数为1
result = "true|身份证号通过验证。";
} else {
result = "false|身份证号与性别不相符。";
}
} else if (sex.equals("女")) {
// 性别为女,最后一位是偶数
String temp = id.substring(14);// 最后一位代表性别
int isex = Integer.parseInt(temp);
if (isex % 2 == 0) {// 除2余数为0
result = "true|身份证号通过验证。";
} else {
result = "false|身份证号与性别不相符。";
}
} else {
result = "false|性别录入错误。";
}
} else {
// 出生日期与身份证中的出生日期不相符
result = "false|出生日期与身份证中的出生日期不相符。";
}
return result;
}
/**
* 校验18位身份证号
*
* @param id
* 18位身份证号
* @param birthday出生日期8位(20071207)
* @param sex,性别,男为奇数,女为偶数
* @return result
*/
public static String checkId_18(String id, String birthday, String sex) {
String result = "";
String birth_id = id.substring(6, 14);// 8位日期
if (birth_id.equals(birthday)) {
// 检验日期,出生日期与身份证中的出生日期相符,然后检验性别
if (sex.equals("男")) {
// 性别为男,最后一位是奇数
String temp = id.substring(16, 17);// 倒数第二位代表性别
int isex = Integer.parseInt(temp);
if (isex % 2 == 1) {// 除2余数为1
result = "true|身份证号通过验证。";
} else {
result = "false|身份证号与性别不相符。";
}
} else if (sex.equals("女")) {
// 性别为女,最后一位是偶数
String temp = id.substring(16, 17);// 倒数第二位代表性别
int isex = Integer.parseInt(temp);
if (isex % 2 == 0) {// 除2余数为0
result = "true|身份证号通过验证。";
} else {
result = "false|身份证号与性别不相符。";
}
} else {
result = "false|性别录入错误。";
}
} else {
// 出生日期与身份证中的出生日期不相符
result = "false|出生日期与身份证中的出生日期不相符。";
}
return result;
}
}
js对身份证来进行校验
//身份证号码由15位升到18位
function idCode15To18(sCode15) {
//alert("start");
var arrVerifyCode = [1,0,"x",9,8,7,6,5,4,3,2];
var Wi = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
var i=0,sum=0,code;
var IDCode = sCode15.substr(0,6)+"19"+sCode15.substr(6);
//alert (IDCode);
// 计算校验位,前 17位加权求和,然后除以11取模
for (i = 1; i <=IDCode.length; i++) {
//alert(IDCode.substr(i - 1, 1));
sum = sum + Wi[i - 1]*parseInt(IDCode.substr(i - 1, 1));
}
//sum=14;
sum = sum%11;
return IDCode+arrVerifyCode[sum] ;
}
function checkId(pId){
var arrVerifyCode = [1,0,"x",9,8,7,6,5,4,3,2];
var Wi = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
if(pId.length != 15 && pId.length != 18) return "身份证号共有 15 码或18位";
var Ai=pId.length==18?pId.substring(0,17):pId.slice(0,6)+"19"+pId.slice(6,16);
if (!/^\d+$/.test(Ai)) return "身份证除最后一位外,必须为数字!";
var yyyy=Ai.slice(6,10),mm=Ai.slice(10,12)-1,dd=Ai.slice(12,14);
var d=new Date(yyyy,mm,dd),year=d.getFullYear(),mon=d.getMonth(),day=d.getDate(),now=new Date();
if (year!=yyyy || mon!=mm || day!=dd || d>now || now.getFullYear()-year>140) return "身份证输入错误!";
for(var i=0,ret=0;i<17;i++) ret+=Ai.charAt(i)*Wi[i];
Ai+=arrVerifyCode[ret %=11];
return pId.length ==18 && pId.toLowerCase() != Ai?"身份证最后一位校验失败,身份证输入错误!应该是"+arrVerifyCode[ret %=11]+"请您仔细检查。":Ai;
};
====================================================================
if(form1.sfzhm.value.trim()==""){
alert("身份证号码不能为空");
form1.sfzhm.focus();
return false;
}else{
//根据所在地区、性别、出生日期来校验身份证号码的正确性
var tempSfzhm = form1.sfzhm.value.trim();
tempSfzhm = checkId(tempSfzhm);
tempSfzhm = tempSfzhm.toLowerCase(); //这个入口已经自动将身份证号码转换为小写。
//下面的判断有问题
//tempSfzhm.length==18 且最后一位是x,那么判断就会失败!
//alert(tempSfzhm.length==18 && tempSfzhm.substr(17,1)=='x');
if((!(tempSfzhm.length==18 && tempSfzhm.substr(17,1)=='x' )) && isNaN(tempSfzhm)){
alert("身份证号码错误!"+tempSfzhm);
form1.sfzhm.focus();
return false;
}else{
var id=String(tempSfzhm);
if(id.length==15){
id=idCode15To18(id);
}
//alert(id);
var desSex = form1.xb.value.trim(); //性别
var desSzdq = form1.szdq.value.trim();//所在地区
var desCsrq = form1.csrq.value.trim();//出生日期
var tempSex=id.slice(14,17)%2?"男":"女";
if(tempSex=="男"){
tempSex = "1";
}else{
tempSex="0";
}
var tempCsrq =id.substr(6,4)+"/"+id.substr(10,2)+"/"+id.substr(12,2);
//alert(tempCsrq);
//var tempSzdq = id.substr(0,2);
//var tempSzdq2 = id.substr(0,4);
//var tempSzdq3 = id.substr(0,6);
if(desSex!=tempSex){
alert("身份证号码错误!和性别不相符。");
form1.sfzhm.focus();
return false;
}
if(desCsrq!=tempCsrq){
alert("身份证号码错误!和出生日期不相符。");
form1.sfzhm.focus();
return false;
}
//
//if(desSzdq!=tempSzdq && desSzdq!=tempSzdq2 && desSzdq!=tempSzdq3 ){
// alert("身份证号码错误!和所在地区不相符。");
// form1.sfzhm.focus();
// return false;
//}
//最后将15位的升位到18位,保存到数据库。
//alert("开始转换升位");
document.forms[0].sfzhm.value=id.toLowerCase();
}
}
================下面是java程序===========================================
分享到:
相关推荐
Oracle身份证号码校验函数,可以将15位身份号码升为18位,检验出生年月等信息
1. PB(前台验证):在用户输入身份证号时,首先应用校验规则检查15位号码的正确性。如果符合规则,接着进行升位操作,通常是在原有号码基础上添加“19”作为新出生年份的前两位,同时计算新的校验码,以确保升位后...
接下来,**自动升位**可能指的是在处理身份证号码时,如果遇到早期的15位身份证号码,工具会自动将其转换为18位。这是因为1999年后,我国开始全面使用18位身份证,而之前发放的15位身份证在某些情况下需要升级以适应...
if (15 == val.length) //15位身份证号码 { birthdayValue = val.charAt(6) + val.charAt(7); if (parseInt(birthdayValue) ) { birthdayValue = '20' + birthdayValue; } else { birthdayValue = '19' + ...
身份证真伪查询系统,提供身份证号码,身份证升位查询,身份证号码验证,并有效识别身份证真伪。 身份证真伪查询系统 2.5 更新内容:优化了程序和更新了数据库。 1. 如果输入18位身份证号码,可以查询户籍、生日、...
身份证号码是由17位地区、日期编号和顺序编号,以及1位校验码组成的18位数字。校验码的计算涉及到特定的加权和模运算。 首先,我们要理解校验码的计算过程: 1. 对前17位数字分别乘以对应的权重(7,9,10,5,8,4...
- 要将15位身份证升至18位,需要在第7位插入一个1,然后计算校验码。公式如`=IF(LEN(A2)=15,REPLACE(A2,7,,19)&MID("10X98765432",MOD(SUMPRODUCT(MID(REPLACE(A2,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW...
它的引入,正如电子钱包替代了传统纸币一样,有效地减少了实体身份证遗失带来的不便和安全风险。通过刷手机配合人脸识别技术,用户不再需要频繁地出示和携带实体身份证件。 要使用微信身份证网证,首先需要下载并...
需要注意的是,实际应用中可能需要考虑更多细节,比如身份证号码的特殊规则(如15位升18位的转换)、图片预处理(去除噪声、裁剪、二值化等)以及提高识别率的策略等。此外,考虑到隐私和合规性,处理个人身份信息时...
综上所述,自助终端机集成身份证阅读器在功能、性能和用户体验上都有着较高要求,品牌如新中新和国腾等提供的产品均满足了这些需求,通过技术创新和人性化设计,确保了高效、安全的身份验证服务。在选择时,用户可...
本文档主要介绍了自助终端机集成的三种常用身份证阅读器品牌:新中新、昌贸和国腾,重点关注新中新品牌的两款产品DKQ-116D和DKQ-A16D,以及国腾的GTICR100身份证阅读器。 新中新身份证阅读器DKQ-116D是一款经典型号...
基于学生管理系统添加学生、修改学生、删除学生、查找学生等功能,新增注册、登录、忘记密码功能,注册包括身份证验证和手机号码验证,登录包括验证码信息验证,忘记密码需要通过身份证信息和手机号信息进行身份验证...
MOD(SUM(MID(REPLACE(B2,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),""))` 这个公式综合了上述两个功能,能处理15位身份证号码的升位和18位身份证号码的校验。 7. **VLOOKUP函数**:...
综上所述,利用Excel模板制作的小升初报名表是一种高效、规范的信息管理方式,既方便了学校收集和整理报名信息,也使得家长能够清晰地了解报名流程和要求。在实际操作中,应根据学校的实际需求和规定,适当调整和...
- 登录系统查看信息状态,等待身份证和户籍信息验证。 - 验证通过后,可打印信息采集表。 5. **打印信息采集表**: - 使用兼容的浏览器(如Chrome、Firefox、IE10及以上版本)进行打印,这是报名所需的重要材料...
- **房主身份证**:验证房产归属。 **非京籍入学材料:** 1. **在京实际居住证明**: - 自有房产:需提供房产证书、购房发票、租赁合同等相关文件,并确保所有证件在有效期内。 - 租房:租赁合同、房主房产证明...
修正 全部应用身份证号码验证失效(18位,去掉过时的15位)的问题,感谢 得意生活 提交问题 修正 随机广告在三条以上时同时展示多条广告的问题,感谢 暨阳社区 反馈问题 修正 免费版不能正常使用 Flash 幻灯广告的...
IDCard(身份证)表明了系统对身份证读取和验证的强化,UpdateP(更新包)意味着新版本包含了对原有功能的改进,而版本号4.0.0.145则显示了软件的具体版本,通常表示修复了之前版本的问题,增加了新特性或提升了性能...
"准考证号"和"身份证号"是重要的身份验证信息,确保每个报名学生的身份真实无误。 "通讯地址"和"邮政编码"用于学校寄送通知书和其他重要资料。 "报名号"是学生在报名过程中获得的唯一标识,便于学校管理。 "脱产...