验证身份证号码是否符合规则
- package com.nebula;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- public class CheckIdCard {
- public static final String ACCEPT = ""; // 检查通过是返回的的成功标识字符串
- public static final int EIGHTEEN_IDCARD = 18; //标识18位身份证号码
- public static final int FIFTEEN_IDCARD = 15; //标识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 stub
- String idCard = "142424870329324";
- String result = chekIdCard(1,idCard);
- if( "".equals(result) )
- System.out.println("身份证合法");
- else
- System.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);
- else
- return 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));
- else
- month = 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));
- }
- }
验证身份证号码是否符合规则相关推荐
- .net验证身份证号是否符合规则
验证身份证号是否符合规则,比较实用,错判率我自己测试为0,挺好用的,欢迎大神补充. protected bool checkidcard(string idcard){//验证18位或者17位加大小写 ...
- 今天写了个自定义函数验证身份证号是否符合规则
大家好,我是老王.今天调了半天,报了各种错误,终于写好了这个验证身份证号的自定义函数,规则可以参考身份证号码的编排规则 CREATE OR REPLACE FUNCTION LAOWANG_CHECK ...
- 详细验证身份证号码规则和姓名(汉字)的java代码
一.验证汉字的正则表达式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...
- 具体验证身份证号码规则和姓名(汉字)的java代码
一.验证汉字的正則表達式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...
- java代码验证身份证号码经典版
package com.haier.hmms.util; import java.text.SimpleDateFormat; import java.util.Date; /** * 验证身份证号 ...
- 学以致用——Java验证身份证号码是否正确(带校验算法)
需求: 验证身份证号码是否正确(带校验算法) 源码: package javaCoreTech1; import java.io.BufferedReader; import java.io.IOEx ...
- java验证身份证号码是否有效源代码
转载自 java验证身份证号码是否有效源代码 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 package test; import java.t ...
- JS(JavaScript)验证身份证号码格式的合法性
一.JS(JavaScript)验证身份证号码格式的合法性,前端工程师会用到JavaScript验证身份证号码是否合法,这里分享一段本人多年以前多写的JavaScript验证输入身份证号码合法性的代码 ...
- 身份证号码的编码规则及校验
前言 本文内容适用于二代身份证,如无特殊说明,本文中所说的身份证皆指二代身份证. 笔者目前使用的jdk版本是1.6.0_29,Eclipse版本是Juno Release,Build id 20120 ...
最新文章
- 老板说我最近飘了,都敢用 MySQL 实现分布式锁了
- 美团面试失败(Java开发)
- 国防科技大学教授:殷建平——计算机科学理论的过去、现在与未来
- matlab自动重合闸,电力系统自动重合闸matlab仿真 - 图文
- 安防市场规模超万亿 罗曼股份推智慧联动安防
- 【数据库】Mysql函数DATE_ADD() 增加日期/时间
- android AIDL示例代码(mark下)
- php通过smtp发送邮件源码_PHP SMTP发送邮件函数
- 从零开始学前端:列表标签 --- 今天你学习了吗?(CSS:Day06)
- bzoj1854: [Scoi2010]游戏 贪心
- sqlserver 中怎样查看一个数据库中表的关系
- document.execCommand()的用法小记
- 设计模式(13)——构建者模式(Builder)
- edge浏览器卸载不掉_【喂你播】华为申请 “荣耀”啤酒饮料类商标;微软确认Edge浏览器无法卸载...
- ios系统软件迁移到安卓_苹果系统怎么把文件转到安卓手机?
- web大作业:简单的学生网页作业源码 基于html css javascript jquery实现智能分控网站
- Android 手机的高级终端 Termux 安装、使用
- 供应商太多,怎么才能高效比价?
- 程序员35岁以后干什么?大龄程序员现状揭秘
- OpenGL纹理贴图
热门文章
- 首席经济学家金岩石:区块链是机器创造的信任,这种信任是所有交易的基础
- 友善之臂smart210—安装Linux系统
- 丁向荣单片机pdf_单片机原理与应用(C语言版)——基于STC15W201S系列单片机 丁向荣 纺著 9787121246357...
- noise2noise学习笔记
- BB10 Cascades Beta2开发环境搭建
- cnn 部分初级代码
- Acer 笔记本 471g装固态硬盘,将模式转化成AHCI模式,让你的固态硬盘提速30%以上。
- 电商-分享时短链接生成方案
- linux安装ncurses教程,Ubuntu 安装 Ncurses
- ncurses库移植到arm平台