[java]  view plain copy print ?
  1. package com.nebula;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class CheckIdCard {
  5. public static final String ACCEPT = ""; // 检查通过是返回的的成功标识字符串
  6. public static final int EIGHTEEN_IDCARD = 18;   //标识18位身份证号码
  7. public static final int FIFTEEN_IDCARD = 15;    //标识15位身份证号码
  8. public static final int MAX_MAINLAND_AREACODE = 659004; //大陆地区地域编码最大值
  9. public static final int MIN_MAINLAND_AREACODE = 110000; //大陆地区地域编码最小值
  10. public static final int HONGKONG_AREACODE = 810000; //香港地域编码值
  11. public static final int TAIWAN_AREACODE = 710000;   //台湾地域编码值
  12. public static final int MACAO_AREACODE = 820000;    //澳门地域编码值
  13. private static final int MAN_SEX = 1;   //标识男性
  14. private static final int WOMAN_SEX = 2; //标识女性
  15. //储存18位身份证校验码
  16. private static final String[] SORTCODES = new String[]{"1","0","X","9","8","7","6","5","4","3","2"};
  17. /**
  18. * @param args
  19. */
  20. public static void main(String[] args) {
  21. // TODO Auto-generated method stub
  22. String idCard = "142424870329324";
  23. String result = chekIdCard(1,idCard);
  24. if( "".equals(result) )
  25. System.out.println("身份证合法");
  26. else
  27. System.out.println(result);
  28. }
  29. /**
  30. * 验证身份证主方法
  31. */
  32. public static String chekIdCard( int sex,String idCardInput ){
  33. if( idCardInput == null || "".equals(idCardInput))
  34. return "身份证号码为必填";
  35. if( idCardInput.length() != 18 && idCardInput.length() !=15 )
  36. return "身份证号码位数不符";
  37. if( idCardInput.length() == 15)
  38. return checkIdCard15(sex,idCardInput);
  39. else
  40. return checkIdCard18(sex,idCardInput);
  41. }
  42. /**
  43. * 验证15位身份证号码
  44. */
  45. private static String checkIdCard15( int sex,String idCardInput ){
  46. String numberResult = checkNumber(FIFTEEN_IDCARD,idCardInput);
  47. if( !ACCEPT.equals(numberResult))
  48. return numberResult;
  49. String areaResult = checkArea(idCardInput);
  50. if( !ACCEPT.equals(areaResult))
  51. return areaResult;
  52. String birthResult = checkBirthDate( FIFTEEN_IDCARD, idCardInput);
  53. if( !ACCEPT.equals(birthResult))
  54. return birthResult;
  55. String sortCodeResult = checkSortCode(FIFTEEN_IDCARD,sex,idCardInput);
  56. if( !ACCEPT.equals(sortCodeResult))
  57. return sortCodeResult;
  58. String checkCodeResult = checkCheckCode(FIFTEEN_IDCARD,idCardInput);
  59. if( !ACCEPT.equals(checkCodeResult))
  60. return checkCodeResult;
  61. return ACCEPT;
  62. }
  63. /**
  64. * 验证18位身份证号码
  65. */
  66. private static String checkIdCard18( int sex, String idCardInput ){
  67. String numberResult = checkNumber(EIGHTEEN_IDCARD,idCardInput);
  68. if( !ACCEPT.equals(numberResult))
  69. return numberResult;
  70. String areaResult = checkArea(idCardInput);
  71. if( !ACCEPT.equals(areaResult))
  72. return areaResult;
  73. String birthResult = checkBirthDate( EIGHTEEN_IDCARD, idCardInput);
  74. if( !ACCEPT.equals(birthResult))
  75. return birthResult;
  76. String sortCodeResult = checkSortCode(EIGHTEEN_IDCARD,sex,idCardInput);
  77. if( !ACCEPT.equals(sortCodeResult))
  78. return sortCodeResult;
  79. String checkCodeResult = checkCheckCode(EIGHTEEN_IDCARD,idCardInput);
  80. if( !ACCEPT.equals(checkCodeResult))
  81. return checkCodeResult;
  82. return ACCEPT;
  83. }
  84. /**
  85. * 验证身份证的地域编码是符合规则
  86. */
  87. private static String checkArea( String idCardInput ){
  88. String subStr = idCardInput.substring(0, 6);
  89. int areaCode = Integer.parseInt(subStr);
  90. if( areaCode != HONGKONG_AREACODE && areaCode != TAIWAN_AREACODE
  91. && areaCode != MACAO_AREACODE
  92. && ( areaCode > MAX_MAINLAND_AREACODE || areaCode < MIN_MAINLAND_AREACODE) )
  93. return "输入的身份证号码地域编码不符合大陆和港澳台规则";
  94. return ACCEPT;
  95. }
  96. /**
  97. * 验证身份证号码数字字母组成是否符合规则
  98. */
  99. private static String checkNumber( int idCardType ,String idCard ){
  100. char[] chars = idCard.toCharArray();
  101. if( idCardType == FIFTEEN_IDCARD ){
  102. for( int i = 0; i<chars.length;i++){
  103. if( chars[i] > '9' )
  104. return idCardType+"位身份证号码中不能出现字母";
  105. }
  106. } else {
  107. for( int i = 0; i < chars.length; i++ ) {
  108. if( i < chars.length-1 ){
  109. if( chars[i] > '9' )
  110. return EIGHTEEN_IDCARD+"位身份证号码中前"+(EIGHTEEN_IDCARD-1)+"不能出现字母";
  111. } else {
  112. if( chars[i] > '9' && chars[i] != 'X')
  113. return idCardType+"位身份证号码中最后一位只能是数字0~9或字母X";
  114. }
  115. }
  116. }
  117. return ACCEPT;
  118. }
  119. /**
  120. * 验证身份证号码出生日期是否符合规则
  121. */
  122. private static String checkBirthDate(int idCardType, String idCardInput ){
  123. String yearResult = checkBirthYear(idCardType,idCardInput);
  124. if( !ACCEPT.equals(yearResult))
  125. return yearResult;
  126. String monthResult = checkBirthMonth(idCardType,idCardInput);
  127. if( !ACCEPT.equals(monthResult))
  128. return monthResult;
  129. String dayResult = checkBirthDay(idCardType,idCardInput);
  130. if( !ACCEPT.equals(dayResult))
  131. return dayResult;
  132. return ACCEPT;
  133. }
  134. /**
  135. * 验证身份证号码出生日期年份是否符合规则
  136. */
  137. private static String checkBirthYear(int idCardType, String idCardInput){
  138. if( idCardType == FIFTEEN_IDCARD){
  139. int year = Integer.parseInt(idCardInput.substring(6, 8));
  140. if( year < 0 || year > 99 )
  141. return idCardType+"位的身份证号码年份须在00~99内";
  142. } else {
  143. int year = Integer.parseInt(idCardInput.substring(6, 10));
  144. int yearNow = getYear();
  145. if( year < 1900 || year > yearNow )
  146. return idCardType+"位的身份证号码年份须在1900~"+yearNow+"内";
  147. }
  148. return ACCEPT;
  149. }
  150. /**
  151. * 验证身份证号码出生日期月份是否符合规则
  152. */
  153. private static String checkBirthMonth(int idCardType, String idCardInput){
  154. int month = 0;
  155. if( idCardType == FIFTEEN_IDCARD)
  156. month = Integer.parseInt(idCardInput.substring(8, 10));
  157. else
  158. month = Integer.parseInt(idCardInput.substring(10, 12));
  159. if( month < 1 || month > 12)
  160. return "身份证号码月份须在01~12内";
  161. return ACCEPT;
  162. }
  163. /**
  164. * 验证身份证号码出生日期天数是否符合规则
  165. */
  166. private static String checkBirthDay(int idCardType, String idCardInput){
  167. boolean bissextile = false;
  168. int year,month,day;
  169. if( idCardType == FIFTEEN_IDCARD){
  170. year = Integer.parseInt("19"+idCardInput.substring(6, 8));
  171. month = Integer.parseInt(idCardInput.substring(8, 10));
  172. day = Integer.parseInt(idCardInput.substring(10, 12));
  173. } else {
  174. year = Integer.parseInt(idCardInput.substring(6, 10));
  175. month = Integer.parseInt(idCardInput.substring(10, 12));
  176. day = Integer.parseInt(idCardInput.substring(12, 14));
  177. }
  178. if( year%4 == 0 && year%100 != 0 || year%400 ==0 )
  179. bissextile = true;
  180. switch( month ){
  181. case 1:
  182. case 3:
  183. case 5:
  184. case 7:
  185. case 8:
  186. case 10:
  187. case 12:
  188. if( day < 1 || day > 31 )
  189. return "身份证号码大月日期须在1~31之间";
  190. break;
  191. case 4:
  192. case 6:
  193. case 9:
  194. case 11:
  195. if( day < 1 || day > 30 )
  196. return "身份证号码小月日期须在1~30之间";
  197. break;
  198. case 2:
  199. if(bissextile){
  200. if( day < 1 || day > 29 )
  201. return "身份证号码闰年2月日期须在1~29之间";
  202. }else {
  203. if( day < 1 || day > 28 )
  204. return "身份证号码非闰年2月日期年份须在1~28之间";
  205. }
  206. break;
  207. }
  208. return ACCEPT;
  209. }
  210. /**
  211. * 验证身份证号码顺序码是否符合规则,男性为偶数,女性为奇数
  212. */
  213. private static String checkSortCode(int idCardType ,int sex,String idCardInput){
  214. int sortCode = 0;
  215. if( idCardType == FIFTEEN_IDCARD ){
  216. sortCode = Integer.parseInt(idCardInput.substring(12, 15));
  217. } else {
  218. sortCode = Integer.parseInt(idCardInput.substring(14, 17));
  219. }
  220. if( sex == MAN_SEX ){
  221. if( sortCode%2 == 0)
  222. return "男性的身份证顺序码须为奇数";
  223. } else {
  224. if( sortCode%2 != 0)
  225. return "女性的身份证顺序码须为偶数";
  226. }
  227. return ACCEPT;
  228. }
  229. /**
  230. * 验证18位身份证号码校验码是否符合规则
  231. */
  232. private static String checkCheckCode( int idCardType , String idCard ){
  233. if( idCardType == EIGHTEEN_IDCARD ){
  234. int sum = 0;
  235. char[] chars = idCard.toCharArray();
  236. for( int i=0; i<chars.length; i++ ){
  237. if( i==0 ) sum = sum+(chars[i]*7);
  238. if( i==1 ) sum = sum+(chars[i]*9);
  239. if( i==2 ) sum = sum+(chars[i]*10);
  240. if( i==3 ) sum = sum+(chars[i]*5);
  241. if( i==4 ) sum = sum+(chars[i]*5);
  242. if( i==5 ) sum = sum+(chars[i]*8);
  243. if( i==6 ) sum = sum+(chars[i]*4);
  244. if( i==7 ) sum = sum+(chars[i]*1);
  245. if( i==8 ) sum = sum+(chars[i]*6);
  246. if( i==9 ) sum = sum+(chars[i]*3);
  247. if( i==10 ) sum = sum+(chars[i]*7);
  248. if( i==11 ) sum = sum+(chars[i]*9);
  249. if( i==12 ) sum = sum+(chars[i]*10);
  250. if( i==13 ) sum = sum+(chars[i]*5);
  251. if( i==14 ) sum = sum+(chars[i]*8);
  252. if( i==15 ) sum = sum+(chars[i]*4);
  253. if( i==16 ) sum = sum+(chars[i]*2);
  254. }
  255. int checkCode = sum%11;
  256. String sortCode = SORTCODES[checkCode];
  257. if(!sortCode.equals(String.valueOf(chars[chars.length-1])))
  258. return "身份中的校验码不正确";
  259. }
  260. return ACCEPT;
  261. }
  262. /**
  263. * 返回当前年份
  264. */
  265. private static int getYear(){
  266. Date now = new Date();
  267. SimpleDateFormat format = new SimpleDateFormat("yyyymmdd");
  268. String nowStr = format.format(now);
  269. return Integer.parseInt(nowStr.substring(0, 4));
  270. }
  271. }

验证身份证号码是否符合规则相关推荐

  1. .net验证身份证号是否符合规则

    验证身份证号是否符合规则,比较实用,错判率我自己测试为0,挺好用的,欢迎大神补充. protected bool checkidcard(string idcard){//验证18位或者17位加大小写 ...

  2. 今天写了个自定义函数验证身份证号是否符合规则

    大家好,我是老王.今天调了半天,报了各种错误,终于写好了这个验证身份证号的自定义函数,规则可以参考身份证号码的编排规则 CREATE OR REPLACE FUNCTION LAOWANG_CHECK ...

  3. 详细验证身份证号码规则和姓名(汉字)的java代码

    一.验证汉字的正则表达式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...

  4. 具体验证身份证号码规则和姓名(汉字)的java代码

    一.验证汉字的正則表達式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...

  5. java代码验证身份证号码经典版

    package com.haier.hmms.util; import java.text.SimpleDateFormat; import java.util.Date; /**  * 验证身份证号 ...

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

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

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

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

  8. JS(JavaScript)验证身份证号码格式的合法性

    一.JS(JavaScript)验证身份证号码格式的合法性,前端工程师会用到JavaScript验证身份证号码是否合法,这里分享一段本人多年以前多写的JavaScript验证输入身份证号码合法性的代码 ...

  9. 身份证号码的编码规则及校验

    前言 本文内容适用于二代身份证,如无特殊说明,本文中所说的身份证皆指二代身份证. 笔者目前使用的jdk版本是1.6.0_29,Eclipse版本是Juno Release,Build id 20120 ...

最新文章

  1. 老板说我最近飘了,都敢用 MySQL 实现分布式锁了
  2. 美团面试失败(Java开发)
  3. 国防科技大学教授:殷建平——计算机科学理论的过去、现在与未来
  4. matlab自动重合闸,电力系统自动重合闸matlab仿真 - 图文
  5. 安防市场规模超万亿 罗曼股份推智慧联动安防
  6. 【数据库】Mysql函数DATE_ADD() 增加日期/时间
  7. android AIDL示例代码(mark下)
  8. php通过smtp发送邮件源码_PHP SMTP发送邮件函数
  9. 从零开始学前端:列表标签 --- 今天你学习了吗?(CSS:Day06)
  10. bzoj1854: [Scoi2010]游戏 贪心
  11. sqlserver 中怎样查看一个数据库中表的关系
  12. document.execCommand()的用法小记
  13. 设计模式(13)——构建者模式(Builder)
  14. edge浏览器卸载不掉_【喂你播】华为申请 “荣耀”啤酒饮料类商标;微软确认Edge浏览器无法卸载...
  15. ios系统软件迁移到安卓_苹果系统怎么把文件转到安卓手机?
  16. web大作业:简单的学生网页作业源码 基于html css javascript jquery实现智能分控网站
  17. Android 手机的高级终端 Termux 安装、使用
  18. 供应商太多,怎么才能高效比价?
  19. 程序员35岁以后干什么?大龄程序员现状揭秘
  20. OpenGL纹理贴图

热门文章

  1. 首席经济学家金岩石:区块链是机器创造的信任,这种信任是所有交易的基础
  2. 友善之臂smart210—安装Linux系统
  3. 丁向荣单片机pdf_单片机原理与应用(C语言版)——基于STC15W201S系列单片机 丁向荣 纺著 9787121246357...
  4. noise2noise学习笔记
  5. BB10 Cascades Beta2开发环境搭建
  6. cnn 部分初级代码
  7. Acer 笔记本 471g装固态硬盘,将模式转化成AHCI模式,让你的固态硬盘提速30%以上。
  8. 电商-分享时短链接生成方案
  9. linux安装ncurses教程,Ubuntu 安装 Ncurses
  10. ncurses库移植到arm平台