二代身份证号码校验 Java版

未命名

import
java.text.DateFormat;
import
java.text.ParseException;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.regex.Pattern;

public
class IdCardValidator {

 
  public static void main(String[] args) {
   
    System.out.println(valideIdCard("111111111111111111111"));
   
}

    public static boolean valideIdCard(String idCard)
{

        String idCardPattern =
"^\\d{17}(\\d|X)$";  //
前17位为数字,最后一位为数字或X
        /*
 
      11     北京市
   
    12     天津市
     
  13     河北省
       
14     山西省
       
15     内蒙古自治区
       
21     辽宁省
       
22     吉林省
       
23     黑龙江省
       
31     上海市
       
32     江苏省
       
33     浙江省
       
34     安徽省
       
35     福建省
       
36     江西省
       
37     山东省
       
41     河南省
       
42     湖北省
       
43     湖南省
       
44     广东省
       
45     广西壮族自治区
       
46     海南省
       
50     重庆市
       
51     四川省
       
52     贵州省
       
53     云南省
       
54     西藏自治区
       
61     陕西省
       
62     甘肃省
       
63     青海省
       
64     宁夏回族自治区
       
65     新疆维吾尔自治区
       
71     台湾省
       
81     香港特别行政区
       
82     澳门特别行政区
       
 */
        String provinces = "11, 12, 13, 14, 15, 21,
22, 23, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 45, 46, 50, 51, 52,
53, 54, 61, 62, 63, 64, 65, 71, 81, 82";

   
    // 验证长度
     
  if (idCard.length() != 18) {
 
          return false;
       
}
        //
验证格式
        if (!Pattern.matches(idCardPattern, idCard))
{
            return false;
       
}
        //
验证省级代码
        if (!provinces.contains(idCard.substring(0,2))) {
           
return false;
     
  }
        //
验证年月日
        DateFormat df =
new SimpleDateFormat("yyyyMMdd");
 
      try {
 
          Date birthday = df.parse(idCard.substring(6, 14));
 
          Date min =
df.parse("19000101");
     
      Date max =
df.parse(df.format(new
Date()));
            if
(birthday.before(min) || birthday.after(max))
{
                return
false;
            }
   
    } catch (ParseException
e) {
            return false;
       
}

        //
验证校验位
        /*
       
关于身份证号码最后一位的校验码的算法如下:
        ∑(a[i]*W[i]) mod 11 (
i = 2, 3, ..., 18 )
           "*" : 表示乘号
 
         i:
 表示身份证号码每一位的序号,从右至左,最左侧为18,最右侧为1。
       
   a[i]: 表示身份证号码第 i 位上的号码
       
   W[i]: 表示第 i 位上的权值 W[i] = 2^(i-1) mod 11
   
   设:R = ∑(a[i]*W[i]) mod 11 ( i = 2, 3, ..., 18 )
   
   C = 身份证号码的校验码
      则R和C之间的对应关系如下表:
   
   R:0 1 2 3 4 5 6 7 8 9 10
       C:1 0 X 9 8 7 6 5 4 3
2
      由此看出 X 就是 10,罗马数字中的 10
就是X,所以在新标准的身份证号码中可能含有非数字的字母X。
       
 */
        char residues[] = {‘1‘, ‘0‘,
‘X‘, ‘9‘, ‘8‘, ‘7‘,‘6‘,
‘5‘, ‘4‘, ‘3‘, ‘2‘};
 
      long sum = 0;
   
    for (int
i = 0; i < 17; i++)
{
            sum += Integer.valueOf(idCard.substring(i, i+1)) *
(Math.pow(2,(18-1-i))%11);
 
      }
        return
idCard.charAt(17) == residues[(int)(sum %
11)];
   
}
}

来自为知笔记(Wiz)

二代身份证号码校验 Java版,码迷,mamicode.com

时间: 2024-10-06 02:50:59

二代身份证号码校验 Java版的相关文章

js正则实现二代身份证号码验证详解

js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码表示编码对象常住户口所在县(市.旗.区)的行政区划代码. 出生日期码表示编码对象出生的年.月.日,其中年份用四位数字表示,年.月.日之间不用分隔符. 顺序码表示同一地址码所标识的区域范围内,对同年.月.日出生的人员

java身份证号码校验、邮箱校验、手机号码/电话号码校验

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ValidateUtils 

Java实现身份证号码校验

二话不说,直接上代码. /** * 校验18位身份证号 * * @param identityCode * * 返回true则表示校验通过 */ public boolean checkIdentityCode(String identityCode) { // 校验身份证位数为18位 if (!identityCode.matches("\\d{17}(\\d|x|X)$")) { return false; } Date d = new Date(); DateFormat df

js实现手机号码和身份证号码校验

<script type="text/javascript"> function checkform() { var re; var ss = document.getElementById('txtMobile').value; re = /^(1[358][0-9]{9})$/; if (re.test(ss)==false) { alert("手机号码输入不合法"); return false; } var id=document.getEleme

身份证号码校验

import re import datetime import os import sys str1 = '350825198808080808' pat = re.search(r'[1-9][0-9]{5}([0-9]{4})([0-9]{2})([0-9]{2})[0-9]{3}[0-9X]', str1) if len(str1) != 18 or not pat: print "inValid" sys.exit(1) try: datetime.date(int(pat.

iOS开发之身份证号码校验

// //  Card.h //  THCStore // //  Created by Mac on 15/7/15. //  Copyright (c) 2015年 Mac. All rights reserved. // #import <Foundation/Foundation.h> @interface Card : NSObject + (BOOL)validateIDCardNumber:(NSString *)value; @end // //  Card.m //  THC

身份证号码的正则表达式及验证详解(JavaScript,Regex)

简言 在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案.本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案. 身份证号码说明 居民身份证号码,正确.正式的称谓应该是"公民身份号码".根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 以北京市朝阳区一女性身份证号码为

Jquery身份证号校验以及根据身份证自动写入出生年月

效果图: 根据身份证号自动写入出生年月 身份证号码校验: js代码部分: 1 $(function() { 2 jQuery.validator.addMethod("isIdCardNo", function (value, element) { 3 return this.optional(element) || isIdCardNo(value); 4 }, "请正确输入您的身份证号码"); 5 6 $.datepicker.setDefaults($.dat

js身份证号校验

var idcard = element.value;    var Errors = new Array(true, "身份证号码位数不对!", "身份证号码出生日期超出范围或含有非法字符!",      "身份证号码校验错误!", "身份证号码校验错误!");    var area = {     11 : "北京",     12 : "天津",     13 : "河