Java身份证认证

/*** 身份证验证**/
public class CheckIdCard {// 检查通过是返回的的成功标识字符串public static final String ACCEPT = ""; // 标识18位身份证号码public static final int EIGHTEEN_IDCARD = 18;// 标识15位身份证号码public static final int FIFTEEN_IDCARD = 15; // 大陆地区地域编码最大值public static final int MAX_MAINLAND_AREACODE = 659004; // 大陆地区地域编码最小值public static final int MIN_MAINLAND_AREACODE = 110000; // 香港地域编码值public static final int HONGKONG_AREACODE = 810000; // 台湾地域编码值public static final int TAIWAN_AREACODE = 710000; // 澳门地域编码值public static final int MACAO_AREACODE = 820000; // 标识男性private static final int MAN_SEX = 1; // 标识女性private static final int WOMAN_SEX = 2; // 储存18位身份证校验码private static final String[] SORTCODES = new String[] { "1", "0", "X","9", "8", "7", "6", "5", "4", "3", "2" };/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubString idCard = "142424870329324";String result = chekIdCard(1, idCard);if ("".equals(result))System.out.println("身份证合法");elseSystem.out.println(result);}/*** 验证身份证主方法*/public static String chekIdCard(int sex, String idCardInput) {if (idCardInput == null || "".equals(idCardInput))return "身份证号码为必填";if (idCardInput.length() != 18 && idCardInput.length() != 15)return "身份证号码位数不符";if (idCardInput.length() == 15)return checkIdCard15(sex, idCardInput);elsereturn checkIdCard18(sex, idCardInput);}/*** 验证15位身份证号码*/private static String checkIdCard15(int sex, String idCardInput) {String numberResult = checkNumber(FIFTEEN_IDCARD, idCardInput);if (!ACCEPT.equals(numberResult))return numberResult;String areaResult = checkArea(idCardInput);if (!ACCEPT.equals(areaResult))return areaResult;String birthResult = checkBirthDate(FIFTEEN_IDCARD, idCardInput);if (!ACCEPT.equals(birthResult))return birthResult;String sortCodeResult = checkSortCode(FIFTEEN_IDCARD, sex, idCardInput);if (!ACCEPT.equals(sortCodeResult))return sortCodeResult;String checkCodeResult = checkCheckCode(FIFTEEN_IDCARD, idCardInput);if (!ACCEPT.equals(checkCodeResult))return checkCodeResult;return ACCEPT;}/*** 验证18位身份证号码*/private static String checkIdCard18(int sex, String idCardInput) {String numberResult = checkNumber(EIGHTEEN_IDCARD, idCardInput);if (!ACCEPT.equals(numberResult))return numberResult;String areaResult = checkArea(idCardInput);if (!ACCEPT.equals(areaResult))return areaResult;String birthResult = checkBirthDate(EIGHTEEN_IDCARD, idCardInput);if (!ACCEPT.equals(birthResult))return birthResult;String sortCodeResult = checkSortCode(EIGHTEEN_IDCARD, sex, idCardInput);if (!ACCEPT.equals(sortCodeResult))return sortCodeResult;String checkCodeResult = checkCheckCode(EIGHTEEN_IDCARD, idCardInput);if (!ACCEPT.equals(checkCodeResult))return checkCodeResult;return ACCEPT;}/*** 验证身份证的地域编码是符合规则*/private static String checkArea(String idCardInput) {String subStr = idCardInput.substring(0, 6);int areaCode = Integer.parseInt(subStr);if (areaCode != HONGKONG_AREACODE&& areaCode != TAIWAN_AREACODE&& areaCode != MACAO_AREACODE&& (areaCode > MAX_MAINLAND_AREACODE || areaCode < MIN_MAINLAND_AREACODE))return "输入的身份证号码地域编码不符合大陆和港澳台规则";return ACCEPT;}/*** 验证身份证号码数字字母组成是否符合规则*/private static String checkNumber(int idCardType, String idCard) {char[] chars = idCard.toCharArray();if (idCardType == FIFTEEN_IDCARD) {for (int i = 0; i < chars.length; i++) {if (chars[i] > '9')return idCardType + "位身份证号码中不能出现字母";}} else {for (int i = 0; i < chars.length; i++) {if (i < chars.length - 1) {if (chars[i] > '9')return EIGHTEEN_IDCARD + "位身份证号码中前"+ (EIGHTEEN_IDCARD - 1) + "不能出现字母";} else {if (chars[i] > '9' && chars[i] != 'X')return idCardType + "位身份证号码中最后一位只能是数字0~9或字母X";}}}return ACCEPT;}/*** 验证身份证号码出生日期是否符合规则*/private static String checkBirthDate(int idCardType, String idCardInput) {String yearResult = checkBirthYear(idCardType, idCardInput);if (!ACCEPT.equals(yearResult))return yearResult;String monthResult = checkBirthMonth(idCardType, idCardInput);if (!ACCEPT.equals(monthResult))return monthResult;String dayResult = checkBirthDay(idCardType, idCardInput);if (!ACCEPT.equals(dayResult))return dayResult;return ACCEPT;}/*** 验证身份证号码出生日期年份是否符合规则*/private static String checkBirthYear(int idCardType, String idCardInput) {if (idCardType == FIFTEEN_IDCARD) {int year = Integer.parseInt(idCardInput.substring(6, 8));if (year < 0 || year > 99)return idCardType + "位的身份证号码年份须在00~99内";} else {int year = Integer.parseInt(idCardInput.substring(6, 10));int yearNow = getYear();if (year < 1900 || year > yearNow)return idCardType + "位的身份证号码年份须在1900~" + yearNow + "内";}return ACCEPT;}/*** 验证身份证号码出生日期月份是否符合规则*/private static String checkBirthMonth(int idCardType, String idCardInput) {int month = 0;if (idCardType == FIFTEEN_IDCARD)month = Integer.parseInt(idCardInput.substring(8, 10));elsemonth = Integer.parseInt(idCardInput.substring(10, 12));if (month < 1 || month > 12)return "身份证号码月份须在01~12内";return ACCEPT;}/*** 验证身份证号码出生日期天数是否符合规则*/private static String checkBirthDay(int idCardType, String idCardInput) {boolean bissextile = false;int year, month, day;if (idCardType == FIFTEEN_IDCARD) {year = Integer.parseInt("19" + idCardInput.substring(6, 8));month = Integer.parseInt(idCardInput.substring(8, 10));day = Integer.parseInt(idCardInput.substring(10, 12));} else {year = Integer.parseInt(idCardInput.substring(6, 10));month = Integer.parseInt(idCardInput.substring(10, 12));day = Integer.parseInt(idCardInput.substring(12, 14));}if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)bissextile = true;switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:if (day < 1 || day > 31)return "身份证号码大月日期须在1~31之间";break;case 4:case 6:case 9:case 11:if (day < 1 || day > 30)return "身份证号码小月日期须在1~30之间";break;case 2:if (bissextile) {if (day < 1 || day > 29)return "身份证号码闰年2月日期须在1~29之间";} else {if (day < 1 || day > 28)return "身份证号码非闰年2月日期年份须在1~28之间";}break;}return ACCEPT;}/*** 验证身份证号码顺序码是否符合规则,男性为偶数,女性为奇数*/private static String checkSortCode(int idCardType, int sex,String idCardInput) {int sortCode = 0;if (idCardType == FIFTEEN_IDCARD) {sortCode = Integer.parseInt(idCardInput.substring(12, 15));} else {sortCode = Integer.parseInt(idCardInput.substring(14, 17));}if (sex == MAN_SEX) {if (sortCode % 2 == 0)return "男性的身份证顺序码须为奇数";} else {if (sortCode % 2 != 0)return "女性的身份证顺序码须为偶数";}return ACCEPT;}/*** 验证18位身份证号码校验码是否符合规则*/private static String checkCheckCode(int idCardType, String idCard) {if (idCardType == EIGHTEEN_IDCARD) {int sum = 0;char[] chars = idCard.toCharArray();for (int i = 0; i < chars.length; i++) {if (i == 0)sum = sum + (chars[i] * 7);if (i == 1)sum = sum + (chars[i] * 9);if (i == 2)sum = sum + (chars[i] * 10);if (i == 3)sum = sum + (chars[i] * 5);if (i == 4)sum = sum + (chars[i] * 5);if (i == 5)sum = sum + (chars[i] * 8);if (i == 6)sum = sum + (chars[i] * 4);if (i == 7)sum = sum + (chars[i] * 1);if (i == 8)sum = sum + (chars[i] * 6);if (i == 9)sum = sum + (chars[i] * 3);if (i == 10)sum = sum + (chars[i] * 7);if (i == 11)sum = sum + (chars[i] * 9);if (i == 12)sum = sum + (chars[i] * 10);if (i == 13)sum = sum + (chars[i] * 5);if (i == 14)sum = sum + (chars[i] * 8);if (i == 15)sum = sum + (chars[i] * 4);if (i == 16)sum = sum + (chars[i] * 2);}int checkCode = sum % 11;String sortCode = SORTCODES[checkCode];if (!sortCode.equals(String.valueOf(chars[chars.length - 1])))return "身份中的校验码不正确";}return ACCEPT;}/*** 返回当前年份*/private static int getYear() {Date now = new Date();SimpleDateFormat format = new SimpleDateFormat("yyyymmdd");String nowStr = format.format(now);return Integer.parseInt(nowStr.substring(0, 4));}
}

Java验证身份证信息相关推荐

  1. java验证身份证号码是否有效源代码

    转载自   java验证身份证号码是否有效源代码 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 package test; import java.t ...

  2. python读取身份证照片信息_python验证身份证信息实例代码

    identity-card 验证身份证号码的正确性,不能仅仅通过正则表达式来验证,我们都知道我国的身份证一共是18位,由十七位数字本体码和一位校验码组成. 其排列顺序从左至右依次为:六位数字地址码,八 ...

  3. 正则严格验证身份证信息

    原文:正则严格验证身份证信息 $a = '130424770827005';$reg18 = '/[1-9]\d{5}(((1[9|8])\d{2})|(20[0-1]\d))((0\d)|(1[0- ...

  4. Java验证身份证号码及提取生日信息

    Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息.第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正 ...

  5. Java验证身份证号是否合法

    身份证作为居民的唯一标识.在很多系统中需要用户输入身份证号信息,今天我们就来编写一个方法验证身份证号的合法性. 首先我们来看看身份证号的编码规则: 前1-2位数字表示:所在省(直辖市.自治区)的代码: ...

  6. Java解析身份证信息

    @package com.pcitc.util; import java.text.ParseException; import java.text.SimpleDateFormat; import ...

  7. 学以致用——Java验证身份证号码是否正确(带校验算法)

    需求: 验证身份证号码是否正确(带校验算法) 源码: package javaCoreTech1; import java.io.BufferedReader; import java.io.IOEx ...

  8. 验证身份证信息(python)

    identity-card 验证身份证号码的正确性,不能仅仅通过正则表达式来验证,我们都知道我国的身份证一共是18位,由十七位数字本体码和一位校验码组成. 其排列顺序从左至右依次为:六位数字地址码,八 ...

  9. java读取身份证信息

    public class IdentityCardUtil {private static Pattern pattern = Pattern.compile("^[1-9]\\d{5}(1 ...

最新文章

  1. BSP 二叉树再次讨论
  2. 数据结构实验之链表八:Farey序列
  3. 微信公众平台消息接口开发(11)地理位置查询附近商家
  4. GDCM:gdcm::Preamble的测试程序
  5. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 接线过程
  6. java jxl 写 excel文件_java采用jxl写入一个Excel文件
  7. 织梦缩略图自动补齐绝对路径_[教程]织梦CMS缩略图和文章内容图片自动转化为带域名的绝对路径...
  8. linux mysql 8.0启动不了_MySQL官方源从8.0.3直接yum升级到8.0.4后无法启动
  9. mysql limit锁_mysql中limit的用法
  10. B-S期权定价模型 Black Scholdz
  11. 如何修改修改服务器风扇转速,DELL服务器手动调整风扇转速
  12. java apktool if_apktool反编译详细使用教程
  13. 最新版Unity安装和启动教程
  14. 大核注意力Large Kernel Attention(LKA)
  15. s3cmd常用命令和使用技巧
  16. 自媒体行业现在还能赚钱吗?
  17. 如何能够快速提升自己的工作能力?
  18. 【Android P】 JobScheduler服务源码解析(二) ——框架解析
  19. 深圳的住房公积金的那些事儿~(缴纳标准,用处用法)
  20. python中return返回值怎么累加_Python学习笔记函数之返回值和return语句

热门文章

  1. 不够勇敢(王子变青蛙电视原声带)铃声 不够勇敢(王子变青蛙电视...
  2. 产品经理枕边书:让产品与用户在交互的过程中上瘾
  3. tightvnc ubuntu,10步掌握ubuntu配置tightvnc的方法
  4. Project Euler 题解 #19 Counting Sundays
  5. 0xc0000098(0xc0000098手动修复)
  6. C语言 基础知识之static(static是什么,static的好处,static的使用和作用)
  7. 正点原子STM32F103ZET6学习笔记-新建库函数工程模板
  8. TensorFlow-Slim基础使用
  9. [Web]如何利用Boostrap框架搭建一个还可以的静态网站(四_子页_戒烟小说)
  10. HTML电子邮件的邮件格式