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模數=4static 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);// 計算校正位endint 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餘數為1result = "true|社會安全號碼通過驗證。";} else {result = "false|社會安全號碼與性別不相符。";}} else if (sex.equals("女")) {// 性別為女,最後一位是偶數String temp = id.substring(14);// 最後一位代表性別int isex = Integer.parseInt(temp);if (isex % 2 == 0) {// 除2餘數為0result = "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餘數為1result = "true|社會安全號碼通過驗證。";} else {result = "false|社會安全號碼與性別不相符。";}} else if (sex.equals("女")) {// 性別為女,最後一位是偶數String temp = id.substring(16, 17);// 倒數第二位代表性別int isex = Integer.parseInt(temp);if (isex % 2 == 0) {// 除2餘數為0result = "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程式===========================================