现在的位置: 首页 > 综合 > 正文

身份证号码的升位和验证

2013年12月13日 ⁄ 综合 ⁄ 共 7494字 ⁄ 字号 评论关闭
  1. import java.io.BufferedReader;  
  2.   
  3. import java.io.InputStreamReader;  
  4.   
  5.   
  6.   
  7. /** 
  8.  
  9.  * @author cuiwx 
  10.  
  11.  * wangmj整理优化。 
  12.  
  13.  * 
  14.  
  15.  */  
  16.   
  17. public class IdCard {  
  18.   
  19.     // 经过计算得出的指数数组,算法:2的n-1次方求和,除以11取模  
  20.   
  21.     // 如:2的0次方除以11取模=1,2的1次方除以11取模=2,2的2次方除以11取模=4  
  22.   
  23.     static int[] wi = { 7910584216379105842};  
  24.   
  25.     // 校验位数组  
  26.   
  27.     static char[] ai = { '1''0''x''9''8''7''6''5''4''3''2' };  
  28.   
  29.   
  30.   
  31.     public static void main(String args[]) {  
  32.   
  33.         // IdCard ic = new IdCard();  
  34.   
  35.         // System.currentTimeMillis();  
  36.   
  37.         try {  
  38.   
  39.             boolean flag = false;  
  40.   
  41.             while (flag) {  
  42.   
  43.                 BufferedReader reader = new BufferedReader(  
  44.   
  45.                         new InputStreamReader(System.in));  
  46.   
  47.                 System.out.println("15位身份证号:");  
  48.   
  49.                 String lowerid = reader.readLine();  
  50.   
  51.                 if (lowerid.equals("quit")) {  
  52.   
  53.                     System.out.println("bye~~");  
  54.   
  55.                     break;  
  56.   
  57.                 }  
  58.   
  59.                 System.out.println("8位出生日期(19791216):");  
  60.   
  61.                 String birth = reader.readLine();  
  62.   
  63.   
  64.   
  65.                 System.out.println("请输入性别");  
  66.   
  67.                 String sex = reader.readLine();  
  68.   
  69.   
  70.   
  71.                 System.out.println(checkIdNumber(lowerid, birth, sex));  
  72.   
  73.                 System.out.println("18位号:" + upperIdNumber(lowerid, birth));  
  74.   
  75.                 System.out.println(checkIdNumber(upperIdNumber(lowerid, birth),  
  76.   
  77.                         birth, sex));  
  78.   
  79.             }  
  80.   
  81.         } catch (Exception e) {  
  82.   
  83.             System.out.println(e);  
  84.   
  85.         }  
  86.   
  87.   
  88.   
  89.            
  90.   
  91.     }  
  92.   
  93.   
  94.   
  95.     /** 
  96.  
  97.      * 根据15位身份证号和出生日期计算得出18位身份证号 
  98.  
  99.      *  
  100.  
  101.      * @param lowerId,15位身份证号 
  102.  
  103.      * @param birthday出生日期,19810912 
  104.  
  105.      * @return upperId,返回18位身份证号 
  106.  
  107.      */  
  108.   
  109.     public static String upperIdNumber(String lowerId, String birthday) {  
  110.   
  111.         if (lowerId.length() != 15) {  
  112.   
  113.             return "请录入15位身份证号码。";  
  114.   
  115.         } else {  
  116.   
  117.             return lowerId.substring(06) + birthday.substring(02)  
  118.   
  119.                     + lowerId.substring(6) + ai[checkBit(lowerId, birthday)];  
  120.   
  121.         }  
  122.   
  123.         // return lowerId+ai[checkBit("372832198109126616")];  
  124.   
  125.     }  
  126.   
  127.   
  128.   
  129.     /** 
  130.  
  131.      * 根据15位身份证号和出生日期,计算校验位 
  132.  
  133.      *  
  134.  
  135.      * @param lowerId,15位身份证号 
  136.  
  137.      * @param birthday出生日期,19810912 
  138.  
  139.      * @return mod,第18位校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod] 
  140.  
  141.      */  
  142.   
  143.     public static int checkBit(String lowerId, String birthday) {  
  144.   
  145.         if (lowerId.length() != 15)// 请录入15位身份证号码  
  146.   
  147.             return -1;  
  148.   
  149.   
  150.   
  151.         lowerId = lowerId.substring(06) + birthday.substring(02)  
  152.   
  153.                 + lowerId.substring(6);  
  154.   
  155.         int sum = 0;  
  156.   
  157.         // 计算校验位,前 17位加权求和,然后除以11取模  
  158.   
  159.         for (int i = 1; i < lowerId.length() + 1; i++) {  
  160.   
  161.             sum = sum + wi[i - 1]  
  162.   
  163.                     * (Integer.parseInt(lowerId.substring(i - 1, i)));  
  164.   
  165.         }  
  166.   
  167.         // System.out.println("sum = " + sum);  
  168.   
  169.         // 计算校验位end  
  170.   
  171.         int mod = sum % 11;  
  172.   
  173.   
  174.   
  175.         return mod;  
  176.   
  177.     }  
  178.   
  179.   
  180.   
  181.     /** 
  182.  
  183.      * 根据传入的18位身份证号,计算校验位 
  184.  
  185.      *  
  186.  
  187.      * @param id,18位身份证号 
  188.  
  189.      * @return mod,返回校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod] 
  190.  
  191.      */  
  192.   
  193.     public static int checkBit(String id) {  
  194.   
  195.         String lowerId = id.substring(017);  
  196.   
  197.         int sum = 0;  
  198.   
  199.         for (int i = 1; i < lowerId.length() + 1; i++) {  
  200.   
  201.             sum = sum + wi[i - 1]  
  202.   
  203.                     * (Integer.parseInt(lowerId.substring(i - 1, i)));  
  204.   
  205.         }  
  206.   
  207.           
  208.   
  209.         int mod = sum % 11;  
  210.   
  211.   
  212.   
  213.         return mod;  
  214.   
  215.     }  
  216.   
  217.   
  218.   
  219.     /** 
  220.  
  221.      * 校验身份证号 
  222.  
  223.      *  
  224.  
  225.      * @param id 
  226.  
  227.      *            身份证号,包括15位和18位 
  228.  
  229.      * @param birthday出生日期8位(20071207) 
  230.  
  231.      * @param sex,性别,男为奇数,女为偶数 
  232.  
  233.      * @return result,返回身份证号是否正确 
  234.  
  235.      */  
  236.   
  237.     public static String checkIdNumber(String id, String birthday, String sex) {  
  238.   
  239.         String result = "";  
  240.   
  241.         int len = id.length();  
  242.   
  243.         if (len == 15) {  
  244.   
  245.             // 调用15位身份证号校验方法  
  246.   
  247.             result = checkId_15(id, birthday, sex);  
  248.   
  249.             // System.out.println("15位---------------");  
  250.   
  251.         } else if (len == 18) {  
  252.   
  253.             // 调用18位身份证号校验方法  
  254.   
  255.             result = checkId_18(id, birthday, sex);  
  256.   
  257.             // System.out.println("18位---------------");  
  258.   
  259.         } else {  
  260.   
  261.             result = "false|身份证号长度错误,只能是15位或18位。";  
  262.   
  263.         }  
  264.   
  265.   
  266.   
  267.         return result;  
  268.   
  269.     }  
  270.   
  271.   
  272.   
  273.     /** 
  274.  
  275.      * 校验15位身份证号 
  276.  
  277.      *  
  278.  
  279.      * @param id 
  280.  
  281.      *            15位身份证号 
  282.  
  283.      * @param birthday出生日期8位(20071207) 
  284.  
  285.      * @param sex,性别,男为奇数,女为偶数 
  286.  
  287.      * @return result 
  288.  
  289.      */  
  290.   
  291.     public static String checkId_15(String id, String birthday, String sex) {  
  292.   
  293.         String result = "";  
  294.   
  295.         String birth_id = id.substring(612);// 6位日期  
  296.   
  297.         String birth = birthday.substring(2);  
  298.   
  299.         if (birth_id.equals(birth)) {  
  300.   
  301.             // 检验日期,出生日期与身份证中的出生日期相符,然后检验性别  
  302.   
  303.             if (sex.equals("男")) {  
  304.   
  305.                 // 性别为男,最后一位是奇数  
  306.   
  307.                 String temp = id.substring(14);// 最后一位代表性别  
  308.   
  309.                 int isex = Integer.parseInt(temp);  
  310.   
  311.                 if (isex % 2 == 1) {// 除2余数为1  
  312.   
  313.                     result = "true|身份证号通过验证。";  
  314.   
  315.                 } else {  
  316.   
  317.                     result = "false|身份证号与性别不相符。";  
  318.   
  319.                 }  
  320.   
  321.             } else if (sex.equals("女")) {  
  322.   
  323.                 // 性别为女,最后一位是偶数  
  324.   
  325.                 String temp = id.substring(14);// 最后一位代表性别  
  326.   
  327.                 int isex = Integer.parseInt(temp);  
  328.   
  329.                 if (isex % 2 == 0) {// 除2余数为0  
  330.   
  331.                     result = "true|身份证号通过验证。";  
  332.   
  333.                 } else {  
  334.   
  335.                     result = "false|身份证号与性别不相符。";  
  336.   
  337.                 }  
  338.   
  339.             } else {  
  340.   
  341.                 result = "false|性别录入错误。";  
  342.   
  343.             }  
  344.   
  345.         } else {  
  346.   
  347.             // 出生日期与身份证中的出生日期不相符  
  348.   
  349.             result = "false|出生日期与身份证中的出生日期不相符。";  
  350.   
  351.         }  
  352.   
  353.   
  354.   
  355.         return result;  
  356.   
  357.     }  
  358.   
  359.   
  360.   
  361.     /** 
  362.  
  363.      * 校验18位身份证号 
  364.  
  365.      *  
  366.  
  367.      * @param id 
  368.  
  369.      *            18位身份证号 
  370.  
  371.      * @param birthday出生日期8位(20071207) 
  372.  
  373.      * @param sex,性别,男为奇数,女为偶数 
  374.  
  375.      * @return result 
  376.  
  377.      */  
  378.   
  379.     public static String checkId_18(String id, String birthday, String sex) {  
  380.   
  381.         String result = "";  
  382.   
  383.         String birth_id = id.substring(614);// 8位日期  
  384.   
  385.         if (birth_id.equals(birthday)) {  
  386.   
  387.             // 检验日期,出生日期与身份证中的出生日期相符,然后检验性别  
  388.   
  389.             if (sex.equals("男")) {  
  390.   
  391.                 // 性别为男,最后一位是奇数  
  392.   
  393.                 String temp = id.substring(1617);// 倒数第二位代表性别  
  394.   
  395.                   
  396.   
  397.                 int isex = Integer.parseInt(temp);  
  398.   
  399.                 if (isex % 2 == 1) {// 除2余数为1  
  400.   
  401.                     result = "true|身份证号通过验证。";  
  402.   
  403.                 } else {  
  404.   
  405.                     result = "false|身份证号与性别不相符。";  
  406.   
  407.                 }  
  408.   
  409.             } else if (sex.equals("女")) {  
  410.   
  411.                 // 性别为女,最后一位是偶数  
  412.   
  413.                 String temp = id.substring(1617);// 倒数第二位代表性别  
  414.   
  415.                 int isex = Integer.parseInt(temp);  
  416.   
  417.                 if (isex % 2 == 0) {// 除2余数为0  
  418.   
  419.                     result = "true|身份证号通过验证。";  
  420.   
  421.                 } else {  
  422.   
  423.                     result = "false|身份证号与性别不相符。";  
  424.   
  425.                 }  
  426.   
  427.             } else {  
  428.   
  429.                 result = "false|性别录入错误。";  
  430.   
  431.             }  
  432.   
  433.         } else {  
  434.   
  435.             // 出生日期与身份证中的出生日期不相符  
  436.   
  437.             result = "false|出生日期与身份证中的出生日期不相符。";  
  438.   
  439.         }  
  440.   
  441.   
  442.   
  443.         return result;  
  444.   
  445.     }  
  446.   

抱歉!评论已关闭.