Android 身份证号有效性校验工具类
2017-04-26 20:09
162 查看
不记得从哪找的了,修改了部分代码,修复在Android平台下使用时,时区时间格式异常的问题。
package cn.aikongmeng.demo.utils; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; /** * Created by Arjun on 2017/4/25. * 身份证有效性校验 */ public class IdentityUtils { // 位权值数组 private static byte[] Wi = new byte[17]; // 身份证前部分字符数 private static final byte fPart = 6; // 身份证算法求模关键值 private static final byte fMod = 11; // 旧身份证长度 private static final byte oldIDLen = 15; // 新身份证长度 private static final byte newIDLen = 18; // 新身份证年份标志 private static final String yearFlag = "19"; // 校验码串 private static final String CheckCode = "10X98765432"; // 最小的行政区划码 private static final int minCode = 150000; // 最大的行政区划码 private static final int maxCode = 700000; // 旧身份证号码 // private String oldIDCard=""; // 新身份证号码 // private String newIDCard=""; // 地区及编码 //private String Area[][2] = private static void setWiBuffer() { for (int i = 0; i < Wi.length; i++) { int k = (int) Math.pow(2, (Wi.length - i)); Wi[i] = (byte) (k % fMod); } } //获取新身份证的最后一位:检验位 private static String getCheckFlag(String idCard) { int sum = 0; //进行加权求和 for (int i = 0; i < 17; i++) { sum += Integer.parseInt(idCard.substring(i, i + 1)) * Wi[i]; } //取模运算,得到模值 byte iCode = (byte) (sum % fMod); return CheckCode.substring(iCode, iCode + 1); } //判断串长度的合法性 private static boolean checkLength(final String idCard, boolean newIDFlag) { boolean right = (idCard.length() == oldIDLen) || (idCard.length() == newIDLen); newIDFlag = false; if (right) { newIDFlag = (idCard.length() == newIDLen); } return right; } //获取时间串 private static String getIDDate(final String idCard, boolean newIDFlag) { String dateStr = ""; if (newIDFlag) dateStr = idCard.substring(fPart, fPart + 8); else dateStr = yearFlag + idCard.substring(fPart, fPart + 6); return dateStr; } //判断时间合法性 private static boolean checkDate(final String dateSource) { String dateStr = dateSource.substring(0, 4) + "-" + dateSource.substring(4, 6) + "-" + dateSource.substring(6, 8); System.out.println(dateStr); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = df.parse(dateStr); return (date != null); } catch (java.text.ParseException e) { e.printStackTrace(); return false; } } //旧身份证转换成新身份证号码 public static String getNewIDCard(final String oldIDCard) { //初始化方法 IdentityUtils.setWiBuffer(); if (!checkIDCard(oldIDCard)) { return oldIDCard; } String newIDCard = oldIDCard.substring(0, fPart); newIDCard += yearFlag; newIDCard += oldIDCard.substring(fPart, oldIDCard.length()); String ch = getCheckFlag(newIDCard); newIDCard += ch; return newIDCard; } //新身份证转换成旧身份证号码 public static String getOldIDCard(final String newIDCard) { //初始化方法 IdentityUtils.setWiBuffer(); if (!checkIDCard(newIDCard)) { return newIDCard; } String oldIDCard = newIDCard.substring(0, fPart) + newIDCard.substring(fPart + yearFlag.length(), newIDCard.length() - 1); return oldIDCard; } //判断身份证号码的合法性 public static boolean checkIDCard(final String idCard) { //初始化方法 IdentityUtils.setWiBuffer(); int length = idCard.length(); boolean isNew; if (length == oldIDLen) isNew = false; else if (length == newIDLen) isNew = true; else return false; //String message = ""; if (!checkLength(idCard, isNew)) { //message = "ID长度异常"; return false; } String idDate = getIDDate(idCard, isNew); if (!checkDate(idDate)) { //message = "ID时间异常"; return false; } if (isNew) { String checkFlag = getCheckFlag(idCard); String theFlag = idCard.substring(idCard.length() - 1, idCard.length()); if (!checkFlag.equals(theFlag)) { //message = "新身份证校验位异常"; return false; } } return true; } //获取一个随机的"伪"身份证号码 public static String getRandomIDCard(final boolean idNewID) { //初始化方法 IdentityUtils.setWiBuffer(); Random ran = new Random(); String idCard = getAddressCode(ran) + getRandomDate(ran, idNewID) + getIDOrder(ran); if (idNewID) { String ch = getCheckFlag(idCard); idCard += ch; } return idCard; } //产生随机的地区编码 private static String getAddressCode(Random ran) { if (ran == null) { return ""; } else { int addrCode = minCode + ran.nextInt(maxCode - minCode); return Integer.toString(addrCode); } } //产生随机的出生日期 private static String getRandomDate(Random ran, boolean idNewID) { // TODO Auto-generated method stub if (ran == null) { return ""; } int year = 0; if (idNewID) { year = 1900 + ran.nextInt(2017 - 1900); } else { year = 1 + ran.nextInt(99); } int month = 1 + ran.nextInt(12); int day = 0; if (month == 2) { day = 1 + ran.nextInt(28); } else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { day = 1 + ran.nextInt(31); } else { day = 1 + ran.nextInt(30); } NumberFormat nf = NumberFormat.getIntegerInstance(); nf.setMaximumIntegerDigits(2); nf.setMinimumIntegerDigits(2); String dateStr = Integer.toString(year) + nf.format(month) + nf.format(day); return dateStr; } //产生随机的序列号 private static String getIDOrder(Random ran) { // TODO Auto-generated method stub NumberFormat nf = NumberFormat.getIntegerInstance(); nf.setMaximumIntegerDigits(3); nf.setMinimumIntegerDigits(3); if (ran == null) { return ""; } else { int order = 1 + ran.nextInt(999); return nf.format(order); } } public IdentityUtils() { setWiBuffer(); } /** * @param args */ public static void main(String[] args) { boolean checkFlag = IdentityUtils.checkIDCard("512501197203035172"); System.out.println(checkFlag); } }
相关文章推荐
- Java工具类实现校验公民身份证的有效性
- Java工具类实现校验公民身份证的有效性
- Android工具类,一些方法电话正则,是否为空,日期格式化,星期,车牌,身份证校验,设置地区编码,验证日期字符串是否是YYYY-MM-DD格式,判断字符串是否为数字
- Java开发实现对身份证有效性校验及获得户籍、性别的工具类
- Java工具类实现校验公民身份证的有效性
- Java工具类实现校验公民身份证的有效性
- Android检查账号,密码,身份证,邮箱,手机号有效性的工具类,仿QQ满足条件后变蓝
- Java工具类实现校验公民身份证的有效性
- Android 二代身份证精确校验
- 校验身份证号码的有效性【JS】
- Android之利用正则表达式校验邮箱、手机号、密码、身份证号码等
- Java scripte 校验身份证号码的有效性
- Android 身份证、车牌号验证工具类
- Android 快速使用正则表达式,校验身份证号的实例
- Android探索之旅(第七篇) 各种校验工具类集成(那些年在全时金服的日子里)
- java 校验公民身份证有效性
- Android 【身份证校验方法】已封装 可以直接调用 可用
- Android(Java)正则表达式判断手机号、邮箱、身份证号码、密码、Url、邮编等工具类
- 身份证有效性校验
- 校验身份证有效性