Java校验身份证格式

  • A+
所属分类:Java

在之前小C分享过一篇关于身份证的算法:身份证号码验证算法你了解吗?,今天小C在给大家分享一个关于身份的Java版格式校验。

依然只贴代码,不明白的地方请看注释。

Java校验身份证格式

  1. import java.text.SimpleDateFormat;
  2. import java.util.Calendar;
  3. import java.util.GregorianCalendar;
  4. import java.util.Hashtable;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
  8. public class CheckIDCard {
  9.     /*********************************** 身份证验证开始 ****************************************/
  10.     /**
  11.      * 身份证号码验证 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,
  12.      * 八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码(前六位数)
  13.      * 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 3、出生日期码(第七位至十四位)
  14.      * 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 4、顺序码(第十五位至十七位)
  15.      * 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号, 顺序码的奇数分配给男性,偶数分配给女性。 5、校验码(第十八位数)
  16.      * (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
  17.      * Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
  18.      * (2)计算模 Y = mod(S, 11) (3)通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2
  19.      */
  20.     /**
  21.      * 功能:身份证的有效验证
  22.      *
  23.      * @param IDStr
  24.      *            身份证号
  25.      * @return 有效:返回"" 无效:返回String信息
  26.      * @throws ParseException
  27.      */
  28.     @SuppressWarnings("unchecked")
  29.     public static String IDCardValidate(String IDStr) throws ParseException {
  30.         String errorInfo = "";// 记录错误信息
  31.         String[] ValCodeArr = { "1""0""x""9""8""7""6""5""4",
  32.                 "3""2" };
  33.         String[] Wi = { "7""9""10""5""8""4""2""1""6""3""7",
  34.                 "9""10""5""8""4""2" };
  35.         String Ai = "";
  36.         // ================ 号码的长度 15位或18位 ================
  37.         if (IDStr.length() != 15 && IDStr.length() != 18) {
  38.             errorInfo = "身份证号码长度应该为15位或18位。";
  39.             return errorInfo;
  40.         }
  41.         // =======================(end)========================
  42.         // ================ 数字 除最后以为都为数字 ================
  43.         if (IDStr.length() == 18) {
  44.             Ai = IDStr.substring(017);
  45.         } else if (IDStr.length() == 15) {
  46.             Ai = IDStr.substring(06) + "19" + IDStr.substring(615);
  47.         }
  48.         if (isNumeric(Ai) == false) {
  49.             errorInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";
  50.             return errorInfo;
  51.         }
  52.         // =======================(end)========================
  53.         // ================ 出生年月是否有效 ================
  54.         String strYear = Ai.substring(610);// 年份
  55.         String strMonth = Ai.substring(1012);// 月份
  56.         String strDay = Ai.substring(1214);// 月份
  57.         if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
  58.             errorInfo = "身份证生日无效。";
  59.             return errorInfo;
  60.         }
  61.         GregorianCalendar gc = new GregorianCalendar();
  62.         SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
  63.         try {
  64.             if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
  65.                     || (gc.getTime().getTime() - s.parse(
  66.                             strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
  67.                 errorInfo = "身份证生日不在有效范围。";
  68.                 return errorInfo;
  69.             }
  70.         } catch (NumberFormatException e) {
  71.             e.printStackTrace();
  72.         } catch (java.text.ParseException e) {
  73.             e.printStackTrace();
  74.         }
  75.         if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
  76.             errorInfo = "身份证月份无效";
  77.             return errorInfo;
  78.         }
  79.         if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
  80.             errorInfo = "身份证日期无效";
  81.             return errorInfo;
  82.         }
  83.         // =====================(end)=====================
  84.         // ================ 地区码时候有效 ================
  85.         Hashtable h = GetAreaCode();
  86.         if (h.get(Ai.substring(02)) == null) {
  87.             errorInfo = "身份证地区编码错误。";
  88.             return errorInfo;
  89.         }
  90.         // ==============================================
  91.         // ================ 判断最后一位的值 ================
  92.         int TotalmulAiWi = 0;
  93.         for (int i = 0; i < 17; i++) {
  94.             TotalmulAiWi = TotalmulAiWi
  95.                     + Integer.parseInt(String.valueOf(Ai.charAt(i)))
  96.                     * Integer.parseInt(Wi[i]);
  97.         }
  98.         int modValue = TotalmulAiWi % 11;
  99.         String strVerifyCode = ValCodeArr[modValue];
  100.         Ai = Ai + strVerifyCode;
  101.         if (IDStr.length() == 18) {
  102.             if (Ai.toUpperCase().equals(IDStr.toUpperCase()) == false) {
  103.                 errorInfo = "身份证无效,不是合法的身份证号码";
  104.                 return errorInfo;
  105.             }
  106.         } else {
  107.             return "";
  108.         }
  109.         // =====================(end)=====================
  110.         return "";
  111.     }
  112.     /**
  113.      * 功能:设置地区编码
  114.      *
  115.      * @return Hashtable 对象
  116.      */
  117.     @SuppressWarnings("unchecked")
  118.     private static Hashtable GetAreaCode() {
  119.         Hashtable hashtable = new Hashtable();
  120.         hashtable.put("11""北京");
  121.         hashtable.put("12""天津");
  122.         hashtable.put("13""河北");
  123.         hashtable.put("14""山西");
  124.         hashtable.put("15""内蒙古");
  125.         hashtable.put("21""辽宁");
  126.         hashtable.put("22""吉林");
  127.         hashtable.put("23""黑龙江");
  128.         hashtable.put("31""上海");
  129.         hashtable.put("32""江苏");
  130.         hashtable.put("33""浙江");
  131.         hashtable.put("34""安徽");
  132.         hashtable.put("35""福建");
  133.         hashtable.put("36""江西");
  134.         hashtable.put("37""山东");
  135.         hashtable.put("41""河南");
  136.         hashtable.put("42""湖北");
  137.         hashtable.put("43""湖南");
  138.         hashtable.put("44""广东");
  139.         hashtable.put("45""广西");
  140.         hashtable.put("46""海南");
  141.         hashtable.put("50""重庆");
  142.         hashtable.put("51""四川");
  143.         hashtable.put("52""贵州");
  144.         hashtable.put("53""云南");
  145.         hashtable.put("54""西藏");
  146.         hashtable.put("61""陕西");
  147.         hashtable.put("62""甘肃");
  148.         hashtable.put("63""青海");
  149.         hashtable.put("64""宁夏");
  150.         hashtable.put("65""新疆");
  151.         hashtable.put("71""台湾");
  152.         hashtable.put("81""香港");
  153.         hashtable.put("82""澳门");
  154.         hashtable.put("91""国外");
  155.         return hashtable;
  156.     }
  157.     /**
  158.      * 功能:判断字符串是否为数字
  159.      *
  160.      * @param str
  161.      * @return
  162.      */
  163.     private static boolean isNumeric(String str) {
  164.         Pattern pattern = Pattern.compile("[0-9]*");
  165.         Matcher isNum = pattern.matcher(str);
  166.         if (isNum.matches()) {
  167.             return true;
  168.         } else {
  169.             return false;
  170.         }
  171.     }
  172.     /**
  173.      * 功能:判断字符串是否为日期格式
  174.      *
  175.      * @param str
  176.      * @return
  177.      */
  178.     public static boolean isDate(String strDate) {
  179.         Pattern pattern = Pattern
  180.                 .compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$");
  181.         Matcher m = pattern.matcher(strDate);
  182.         if (m.matches()) {
  183.             return true;
  184.         } else {
  185.             return false;
  186.         }
  187.     }
  188.     /**
  189.      * @param args
  190.      * @throws ParseException
  191.      */
  192.     @SuppressWarnings("static-access")
  193.     public static void main(String[] args) throws ParseException {
  194.         // String IDCardNum="210102820826411";
  195.         // String IDCardNum="210102198208264114";
  196.         String IDCardNum = "210181198807193116";
  197.         CheckIDCard cc = new CheckIDCard();
  198.         System.out.println(cc.IDCardValidate(IDCardNum));
  199.         // System.out.println(cc.isDate("1996-02-29"));
  200.     }
  201.     /*********************************** 身份证验证结束 ****************************************/
  202. }

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

目前评论:14   其中:访客  12   博主  2

    • avatar 请输入您的QQ号 3

      你不怕玄奘来找你啊

      • avatar 黎叔 2

        代码没啥毛病,身份证照片好像是免冠照,唐僧帽子在

        • avatar 纬八路 3

          小心请你去喝茶

          • avatar 呆毛电脑配置网 4

            现在我网站应该还用不到。

            • avatar 野人摊影视分享 3

              测试!

              • avatar 徒步旅行 3

                看到图笑了

                • avatar 姜辰 4

                  厉害了!

                  • avatar Loekman 0

                    公园是哪个元?

                    • avatar Koolight 6

                      牛C又研究乱码了!

                      • avatar 懿古今 5

                        博主连JAVA也研究啊,精力真旺盛

                        • avatar 热腾网 6

                          不是在线验证啊。

                          • avatar 小萝博客 3

                            难得评论一个还得要身份证