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位,检验出生年月等信息
技巧:复制excel的身份证列CTRL+V到输入框后点查询,每次提交【6000】行以内,查询结果按行显示的。 功能:把身份证列的身份证复制过来可以查询身份证号的归属地、生日、年龄、性别等信息。
身份证真伪查询系统,提供身份证号码,身份证升位查询,身份证号码验证,并有效识别身份证真伪。 身份证真伪查询系统 2.5 更新内容:优化了程序和更新了数据库。 1. 如果输入18位身份证号码,可以查询户籍、生日、...
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对...
基于学生管理系统添加学生、修改学生、删除学生、查找学生等功能,新增注册、登录、忘记密码功能,注册包括身份证验证和手机号码验证,登录包括验证码信息验证,忘记密码需要通过身份证信息和手机号信息进行身份验证...
修正 全部应用身份证号码验证失效(18位,去掉过时的15位)的问题,感谢 得意生活 提交问题 修正 随机广告在三条以上时同时展示多条广告的问题,感谢 暨阳社区 反馈问题 修正 免费版不能正常使用 Flash 幻灯广告的...
121 <br>0200 如何使用正则表达式验证电话号码 121 <br>0201 如何使用正则表达式验证输入密码条件 121 <br>0202 如何使用正则表达式验证邮政编号 121 <br>0203 如何使用正则表达式验证手机号 ...
0083 身份证从15位升至18位算法 60 0084 十进制数转二进制数的算法 60 0085 十进制数转八进制数的算法 61 0086 十进制数转十六进制数的算法 62 0087 二、八、十六进制数转十进制数的算法 63 3.4 ...
设计实现对企业人员基本情况的档案的输入、删除与修改,企业人员基本情况主要包括:人员代码、姓名、性别、出生日期、身份证号、籍贯、家庭住址、联系电话、其它情况等(对身份证号,电话号码合法性验证)。 物料档案...
实例141 车牌号码识别 176 3.9 图像工具 177 实例142 获取图片类型 177 实例143 简单画图程序 178 实例144 看图工具 181 实例145 文字保存为图片 182 3.10 图像应用 183 实例146 随机更换壁纸程序 ...
实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...
实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...
实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...
实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...