Android 身份证号码校验
转载自: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 身份证号码校验相关推荐
- JS身份证号码校验大全史上最全号称公安局安全监测
身份证号码校验 function testid(id) {// 1 "验证通过!", 0 //校验不通过 // id为身份证号码var format = /^(([1][1-5]) ...
- 【转载】 身份证号码校验(15位和18位都可以)
转载自: 开源中国社区 面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...
- JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别
目录 1.JS身份证号码校验 2.JS根据身份证号码获取出生年月日 3.JS根据出生年月日获取年龄 4.JS根据身份证号码获取性别 1.JS身份证号码校验 /*** 身份证校验** @export* ...
- validate格式校验之身份证号码校验
//校验身份证号码 function isIdCardNo(num) { var factorArr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5 ...
- vue身份证号码校验
一.vue身份证号码校验? let checkRegNo = (rule,value,callback) => { setTimeout(() => { const ...
- 身份证号码校验(JavaScript)
/*** 身份证号码校验* 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X*/ function checkIdCard(idCard){v ...
- 中国公民身份证号码校验
中国公民身份证号码校验 上图可看出18位位身份证每一部分表示的意义. 图为随机生成身份号码,四川省 乐山市 井研县 1981年12月28日生 这里主要讲解最后一位校验码的验证 校验码主要是由前面17位 ...
- 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位
使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...
- 基于可视化结构的身份证号码校验系统-树莓派实现
基于可视化结构的身份证号码校验系统 摘要: 本作品是一个通用的身份证号码校验系统,目前已经尝试在Linux和Windows系统下运行,结果均可达到理想效果.系统通过运用基础GUI库tkinter创建系 ...
- Oracle身份证号码校验函数
Oracle身份证号码校验函数 CREATE OR REPLACE FUNCTION FUNC_AAC002_15_18 (prm_aac002 varchar2)return varchar2 is ...
最新文章
- 2021年春季学期-信号与系统-第一次作业参考答案-第二题
- Android JNI开发摘录(四)之JNI异常处理
- 【Python】1054 求平均值(Python异常处理练习)
- PHP 如何在Redis中实现事物(事物提交和事物回滚)
- linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 -
电子工程世界-论坛 -
手机版...
- python List中元素两两组合
- 关于“服务器提交了协议冲突. Section=ResponseStatusLine问题请
- typora 字体颜色_Typora 使用教程
- java eventbus 原理_事件总线,事件驱动(RxJava,EventBus)与广播(BroadcastReceiver)(2)
- 记录接触过的开源与非开源
- [转载] 【python】Python中*args和**kwargs的区别(在Python中如何使用可变长参数列表)
- 关于图的题目不给数据范围的情况如何解决
- 大数据技术原理与应用 第三版 林子雨 期末复习(一)大数据概述 第一章 P2
- php excel图表,简易的phpexcel导出柱状图
- 木马病毒 与后门技术
- 奇迹服务器放虚拟机,虚拟机双开奇迹教程
- YTU OJ 2476 C++习题 继承与组合
- EXPLOITING CVE-2016-2060 ON QUALCOMM DEVICES
- Frenetic Python实验(一)
- 跨境电商亚马逊之你知道什么是亚马逊电商吗