`
wmj2003
  • 浏览: 97373 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

身份证号码的升位和验证

阅读更多
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 身份证号码校验函数

    Oracle身份证号码校验函数,可以将15位身份号码升为18位,检验出生年月等信息

    ASP身份证批量校验有效性,自动升位,计算年龄、性别,EXCEL导出

    技巧:复制excel的身份证列CTRL+V到输入框后点查询,每次提交【6000】行以内,查询结果按行显示的。 功能:把身份证列的身份证复制过来可以查询身份证号的归属地、生日、年龄、性别等信息。

    身份证真伪查询系统 2.5.rar

    身份证真伪查询系统,提供身份证号码,身份证升位查询,身份证号码验证,并有效识别身份证真伪。 身份证真伪查询系统 2.5 更新内容:优化了程序和更新了数据库。 1. 如果输入18位身份证号码,可以查询户籍、生日、...

    有关一道身份证的python编程题

    一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对...

    学生管理系统升级版(Java实现)新增注册、登录、忘记密码功能

    基于学生管理系统添加学生、修改学生、删除学生、查找学生等功能,新增注册、登录、忘记密码功能,注册包括身份证验证和手机号码验证,登录包括验证码信息验证,忘记密码需要通过身份证信息和手机号信息进行身份验证...

    VeryIDE Bee 互动营销**台 v1.5 UTF-8.rar

    修正 全部应用身份证号码验证失效(18位,去掉过时的15位)的问题,感谢 得意生活 提交问题 修正 随机广告在三条以上时同时展示多条广告的问题,感谢 暨阳社区 反馈问题 修正 免费版不能正常使用 Flash 幻灯广告的...

    C#编程经验技巧宝典

    121 &lt;br&gt;0200 如何使用正则表达式验证电话号码 121 &lt;br&gt;0201 如何使用正则表达式验证输入密码条件 121 &lt;br&gt;0202 如何使用正则表达式验证邮政编号 121 &lt;br&gt;0203 如何使用正则表达式验证手机号 ...

    C#经验技巧宝典1-5

    0083 身份证从15位升至18位算法 60 0084 十进制数转二进制数的算法 60 0085 十进制数转八进制数的算法 61 0086 十进制数转十六进制数的算法 62 0087 二、八、十六进制数转十进制数的算法 63 3.4 ...

    基于delphi和sqlserver数据库的物料管理系统含详细报告数据库及脚本

    设计实现对企业人员基本情况的档案的输入、删除与修改,企业人员基本情况主要包括:人员代码、姓名、性别、出生日期、身份证号、籍贯、家庭住址、联系电话、其它情况等(对身份证号,电话号码合法性验证)。 物料档案...

    Delphi开发范例宝典目录

    实例141 车牌号码识别 176 3.9 图像工具 177 实例142 获取图片类型 177 实例143 简单画图程序 178 实例144 看图工具 181 实例145 文字保存为图片 182 3.10 图像应用 183 实例146 随机更换壁纸程序 ...

    C#程序开发范例宝典(第2版).part13

    实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...

    C#程序开发范例宝典(第2版).part08

    实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...

    C#程序开发范例宝典(第2版).part02

    实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...

    C#程序开发范例宝典(第2版).part12

    实例104 使用ErrorProvider组件验证文本框输入 150 3.3 EventLog组件 151 实例105 使用EventLog组件读写Windows系统事件日志 151 实例106 使用EventLog组件保存Windows系统日志 153 实例107 使用EventLog组件向...

Global site tag (gtag.js) - Google Analytics