转载自:https://blog.csdn.net/leifengpeng/article/details/50624259,方便自己记忆

public class IDCardValidate {public static final String[] ValCodeArr = { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" };public static final String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2" };// 身份证的最小出生日期,1900年1月1日private final static Date MINIMAL_BIRTH_DATE = new Date(-2209017600000L);private static final String BIRTH_DATE_FORMAT="yyyyMMdd";private final static int NEW_CARD_NUMBER_LENGTH = 18;private final static int OLD_CARD_NUMBER_LENGTH = 15;private final static String LENGTH_ERROR="身份证长度必须为15或者18位!";private final static String NUMBER_ERROR="15位身份证都应该为数字,18位身份证都应该前17位应该都为数字!";private final static String DATE_ERROR="身份证日期验证无效!";private final static String AREA_ERROR="身份证地区编码错误!";private final static String CHECKCODE_ERROR="身份证最后一位校验码有误!";//是否需要返回自动补全成的身份证private static boolean isNeedReturn_AutoCard=false;/**** @param idcardNumber 需要验证的身份证* @param isreturn_AutoCard 验证无误后,是否需要返回自动补全身份证* @return 身份证无误返回传入的身份证号*/public static boolean validate_effective(String idcardNumber,boolean isreturn_AutoCard){isNeedReturn_AutoCard=isreturn_AutoCard;return validate_effective(idcardNumber);}/*** 身份证校验* @param idcardNumber 需要验证的身份证* @return 身份证无误返回传入的身份证号*/public static boolean validate_effective(String idcardNumber){String Ai=idcardNumber.trim();System.out.println(Ai.length()!=15);if(Ai.length()==15|Ai.length()==18){//如果为15位则自动补全到18位if(Ai.length()==OLD_CARD_NUMBER_LENGTH){Ai=contertToNewCardNumber(Ai);}}else{return false;}// 身份证号的前15,17位必须是阿拉伯数字for (int i = 0;  i < NEW_CARD_NUMBER_LENGTH - 1; i++) {char ch = Ai.charAt(i);if( ch < '0' || ch > '9'){return false;}}//校验身份证日期信息是否有效 ,出生日期不能晚于当前时间,并且不能早于1900年try {Date birthDate =getBirthDate(Ai);if(null == birthDate){return false;}if(!birthDate.before(new Date())){return false;}if(!birthDate.after(MINIMAL_BIRTH_DATE)){return false;}/*** 出生日期中的年、月、日必须正确,比如月份范围是[1,12],日期范围是[1,31],还需要校验闰年、大月、小月的情况时,* 月份和日期相符合*/String birthdayPart = getBirthDayPart(Ai);String realBirthdayPart =createBirthDateParser().format(birthDate);if(!birthdayPart.equals(realBirthdayPart)){return false;}} catch (Exception e) {return false;}//校验地区码是否正确Hashtable<String, String> h = GetAreaCode();if (h.get(Ai.substring(0, 2)) == null) {return false;}//校验身份证最后一位 身份证校验码if(!calculateVerifyCode(Ai) .equals(String.valueOf(Ai.charAt(NEW_CARD_NUMBER_LENGTH - 1)))){return false;}return true;}/*** 把15位身份证号码转换到18位身份证号码<br>* 15位身份证号码与18位身份证号码的区别为:<br>* 1、15位身份证号码中,"出生年份"字段是2位,转换时需要补入"19",表示20世纪<br>* 2、15位身份证无最后一位校验码。18位身份证中,校验码根据根据前17位生成** @param oldCardNumber* @return*/private static String contertToNewCardNumber(String oldCardNumber) {StringBuilder buf = new StringBuilder(NEW_CARD_NUMBER_LENGTH);buf.append(oldCardNumber.substring(0, 6));buf.append("19");buf.append(oldCardNumber.substring(6));buf.append(calculateVerifyCode(buf));return buf.toString();}/**计算最后一位校验码  加权值%11* (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和*      Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4* (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* @param cardNumber* @return*/private static String calculateVerifyCode(CharSequence cardNumber) {int sum = 0;for (int i = 0; i < NEW_CARD_NUMBER_LENGTH - 1; i++) {char ch = cardNumber.charAt(i);sum += ((int) (ch - '0')) * Integer.parseInt(Wi[i]);}return ValCodeArr[sum % 11];}/*** 功能:设置地区编码** @return Hashtable 对象*/private static Hashtable<String, String> GetAreaCode() {Hashtable<String, String> hashtable = new Hashtable<String, String>();hashtable.put("11", "北京");hashtable.put("12", "天津");hashtable.put("13", "河北");hashtable.put("14", "山西");hashtable.put("15", "内蒙古");hashtable.put("21", "辽宁");hashtable.put("22", "吉林");hashtable.put("23", "黑龙江");hashtable.put("31", "上海");hashtable.put("32", "江苏");hashtable.put("33", "浙江");hashtable.put("34", "安徽");hashtable.put("35", "福建");hashtable.put("36", "江西");hashtable.put("37", "山东");hashtable.put("41", "河南");hashtable.put("42", "湖北");hashtable.put("43", "湖南");hashtable.put("44", "广东");hashtable.put("45", "广西");hashtable.put("46", "海南");hashtable.put("50", "重庆");hashtable.put("51", "四川");hashtable.put("52", "贵州");hashtable.put("53", "云南");hashtable.put("54", "西藏");hashtable.put("61", "陕西");hashtable.put("62", "甘肃");hashtable.put("63", "青海");hashtable.put("64", "宁夏");hashtable.put("65", "新疆");hashtable.put("71", "台湾");hashtable.put("81", "香港");hashtable.put("82", "澳门");hashtable.put("91", "国外");return hashtable;}private static Date getBirthDate(String idcard) {Date cacheBirthDate=null;try {cacheBirthDate = createBirthDateParser().parse(getBirthDayPart(idcard));} catch (Exception e) {throw new RuntimeException("身份证的出生日期无效");}return new Date(cacheBirthDate.getTime());}private static SimpleDateFormat createBirthDateParser() {return new SimpleDateFormat(BIRTH_DATE_FORMAT);}private static String getBirthDayPart(String idcardnumber) {return idcardnumber.substring(6, 14);}}

Android 身份证号码校验相关推荐

  1. JS身份证号码校验大全史上最全号称公安局安全监测

    身份证号码校验 function testid(id) {// 1 "验证通过!", 0 //校验不通过 // id为身份证号码var format = /^(([1][1-5]) ...

  2. 【转载】 身份证号码校验(15位和18位都可以)

    转载自: 开源中国社区    面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...

  3. JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别

    目录 1.JS身份证号码校验 2.JS根据身份证号码获取出生年月日 3.JS根据出生年月日获取年龄 4.JS根据身份证号码获取性别 1.JS身份证号码校验 /*** 身份证校验** @export* ...

  4. validate格式校验之身份证号码校验

    //校验身份证号码 function isIdCardNo(num) {     var factorArr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5 ...

  5. vue身份证号码校验

    一.vue身份证号码校验? let checkRegNo = (rule,value,callback) => {     setTimeout(() => {         const ...

  6. 身份证号码校验(JavaScript)

    /*** 身份证号码校验* 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X*/ function checkIdCard(idCard){v ...

  7. 中国公民身份证号码校验

    中国公民身份证号码校验 上图可看出18位位身份证每一部分表示的意义. 图为随机生成身份号码,四川省 乐山市 井研县 1981年12月28日生 这里主要讲解最后一位校验码的验证 校验码主要是由前面17位 ...

  8. 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

    使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...

  9. 基于可视化结构的身份证号码校验系统-树莓派实现

    基于可视化结构的身份证号码校验系统 摘要: 本作品是一个通用的身份证号码校验系统,目前已经尝试在Linux和Windows系统下运行,结果均可达到理想效果.系统通过运用基础GUI库tkinter创建系 ...

  10. Oracle身份证号码校验函数

    Oracle身份证号码校验函数 CREATE OR REPLACE FUNCTION FUNC_AAC002_15_18 (prm_aac002 varchar2)return varchar2 is ...

最新文章

  1. 2021年春季学期-信号与系统-第一次作业参考答案-第二题
  2. Android JNI开发摘录(四)之JNI异常处理
  3. 【Python】1054 求平均值(Python异常处理练习)
  4. PHP 如何在Redis中实现事物(事物提交和事物回滚)
  5. linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 - 电子工程世界-论坛 - 手机版...
  6. python List中元素两两组合
  7. 关于“服务器提交了协议冲突. Section=ResponseStatusLine问题请
  8. typora 字体颜色_Typora 使用教程
  9. java eventbus 原理_事件总线,事件驱动(RxJava,EventBus)与广播(BroadcastReceiver)(2)
  10. 记录接触过的开源与非开源
  11. [转载] 【python】Python中*args和**kwargs的区别(在Python中如何使用可变长参数列表)
  12. 关于图的题目不给数据范围的情况如何解决
  13. 大数据技术原理与应用 第三版 林子雨 期末复习(一)大数据概述 第一章 P2
  14. php excel图表,简易的phpexcel导出柱状图
  15. 木马病毒 与后门技术
  16. 奇迹服务器放虚拟机,虚拟机双开奇迹教程
  17. YTU OJ 2476 C++习题 继承与组合
  18. EXPLOITING CVE-2016-2060 ON QUALCOMM DEVICES
  19. Frenetic Python实验(一)
  20. 跨境电商亚马逊之你知道什么是亚马逊电商吗

热门文章

  1. Mac PyCharm下numpy安装
  2. 地平线谭洪贺:AI芯片怎么降功耗?从ISSCC2017说起
  3. aliplayer阿里云播放器直播及录播前端代码
  4. 干支纪年法简便算法_基于回弹法的混凝土实体质量过程控制研究
  5. 开源BI工具对比(一):BI介绍
  6. 数据结构实验报告——线性表
  7. 倍福RS232模块EL6002使用教程及注意事项
  8. 嵩天python测验_北理 嵩天老师 Python程序设计 测验易错题总结
  9. 最新Axure谷歌浏览器Chrome扩展程序安装方法
  10. python自回归模型_向量自回归模型(VAR)到底厉害在哪里?