您的位置:首页 > 数据库

身份证号码的升位和验证

2008-07-04 19:11 169 查看
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程序===========================================

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息