`

身份证号转换15 18

 
阅读更多
package com.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* 中国大陆的身份证检验算法,以及15位和18位身份证的相互转换。
*
*/
public class IdCardUtil {

    public IdCardUtil(){

    }

    /**
     * 15位身份证号码转化为18位的身份证。如果是18位的身份证则直接返回,不作任何变化。
     * @param idCard,15位的有效身份证号码
     * @return idCard18 返回18位的有效身份证
     */
    public String IdCard15to18(String idCard){
        idCard = idCard.trim();
        StringBuffer idCard18 = new StringBuffer(idCard);
        //加权因子
        //int[] weight = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        //校验码值
        char[] checkBit = {'1','0','X','9','8','7','6','5','4','3','2'};
        int sum = 0;
        //15位的身份证
        if(idCard != null && idCard.length()==15){
            idCard18.insert(6, "19");
            for(int index=0;index<idCard18.length();index++){
                char c = idCard18.charAt(index);
                int ai = Integer.parseInt(new Character(c).toString());
                //sum = sum+ai*weight[index];
                //加权因子的算法
                int Wi = ((int)Math.pow(2, idCard18.length()-index))%11;
                sum = sum+ai*Wi;
            }
            int indexOfCheckBit = sum%11; //取模
            idCard18.append(checkBit[indexOfCheckBit]);
        }

        return idCard18.toString();
    }

    /**
     * 转化18位身份证位15位身份证。如果输入的是15位的身份证则不做任何转化,直接返回。
     * @param idCard 18位身份证号码
     * @return idCard15
     */
    public String IdCard18to15(String idCard){
        idCard = idCard.trim();
        StringBuffer idCard15 = new StringBuffer(idCard);
        if(idCard!=null && idCard.length()==18){
            idCard15.delete(17, 18);
            idCard15.delete(6,;
        }
        return idCard15.toString();

    }

    /**
     * 校验是否是一个有效的身份证。如果是18的身份证,则校验18位的身份证。15位的身份证不校验,也无法校验
     * @param idCart
     * @return
     */
    public boolean checkIDCard(String idCard){
        boolean isIDCard = false;
        Pattern pattern = Pattern.compile("\\d{15}|\\d{17}[x,X,0-9]");
        Matcher matcher = pattern.matcher(idCard);
        if(matcher.matches()){//可能是一个身份证
            isIDCard = true;
            if(idCard.length()==18){//如果是18的身份证,则校验18位的身份证。15位的身份证暂不校验
                String IdCard15 = IdCard18to15(idCard);
                String IdCard18 = IdCard15to18(IdCard15);
                if(!idCard.equals(IdCard18)){
                    isIDCard = false;
                }
            }else if(idCard.length()==15){
                isIDCard = true;
            }else{
                isIDCard = false;
            }
        }

        return isIDCard;
    }
   
    public static void main(String args[]){
    IdCardUtil u = new IdCardUtil();
    String idCard = "220211198903230016";//18
    String idCard15 = "220211890323001";//15
    idCard = u.IdCard18to15(idCard);
    System.out.println("---------->>>"+idCard);
    }
   
}
分享到:
评论

相关推荐

    Linux shell编程 验证身份证号码(15/18)

    - **Part1**: 身份证号码15位到18位的转换函数`convert1518`,该函数首先检查输入是否为18位,如果是则截取并返回15位身份证号;如果输入为15位,则进行转换成18位身份证号,涉及复杂的数学运算和校验码计算。 - **...

    SQL15位和18位公民身份证校验函数

    ### SQL15位和18位公民身份证校验函数知识点详解 #### 一、背景介绍 在进行数据录入时,确保身份证信息的合法性至关重要。不正确的身份证信息将导致数据的有效性和准确性大打折扣。为此,设计了一款专门用于校验15...

    kettle 数据过滤,验证

    kettle 提供了两个函数 getId15 和 getId18,分别用于将 15 位身份证号码转换为 18 位和将 18 位身份证号码转换为 15 位。 在 kettle 中,我们使用正则表达式来验证数据。正则表达式是一种基于模式匹配的字符串匹配...

    Qt编写的旧版证号转换程序源码

    本文将详细讲解基于Qt4开发的旧版身份证号转换程序,该程序的主要功能是将15位身份证号码转换为包含世纪信息的18位号码。这个项目对于学习Qt编程和理解身份证号码转换逻辑的人来说非常有价值。 首先,让我们从Qt4...

    18位身份证号码转换成出生日期的函数公式归类.pdf

    "18位身份证号码转换成出生日期的函数公式归类" 在这个函数公式中,我们可以看到的是18位身份证号码转换成出生日期的公式归类,包括身份证号码的性别判断、出生日期提取和年龄计算等信息。 首先,我们需要判断...

    正则表达式校验身份证号码

    身份证号码分为15位和18位两种格式,其中18位号码是在15位基础上增加了一个4位出生年份以及一位校验码。本文将详细介绍如何使用正则表达式进行身份证号码的有效性和合理性验证。 #### 简单校验:正则表达式的使用 ...

    PHP精确验证身份证号

    在实际应用中,我们还需要考虑一些特殊情况,如旧版15位身份证号码的兼容,以及身份证号码中可能出现的非标准字符。同时,为了保护用户隐私,验证身份证号码时不应直接显示完整的号码,而应进行脱敏处理,例如仅显示...

    Java 身份证号查询

    2. **数据类型转换**:从身份证号提取出生日期时,需要将字符串转换为日期对象。这涉及到`SimpleDateFormat`类,用于格式化和解析日期,例如"19900101"转换为`java.util.Date`对象。 3. **行政区划查询**:前6位...

    C#从身份证号提取出生日期

    身份证号码的前6位代表了行政区划代码,第7位到第14位是出生日期,格式为YYYYMMDD,第15位到第17位是顺序码(奇数分配给男性,偶数分配给女性),最后一位是校验码。因此,提取出生日期的关键就是从身份证号码字符串...

    C++中身份证号码验证代码

    身份证号码是由18位数字组成,包含个人信息如出生日期、性别和地区编码等。本项目提供的`checkID.cpp`文件应该包含了实现这个功能的C++代码。通过分析和解释这段代码,我们可以了解到如何在C++中进行身份证号码的...

    js身份证号码获取性别、出生日期、籍贯省市.zip

    - 考虑到15位身份证号码的情况,虽然现在18位身份证已经普及,但仍有老版15位号码存在。 - 校验码的验证,以确保身份证号码的合法性。 - 针对籍贯省市的获取,可能需要维护一个静态的行政区划代码库,或者利用网络...

    java身份证号验证源代码

    身份证号码是由18位数字组成的,包含个人的出生日期、性别、地区等信息,并且具有特定的校验规则。本篇文章将深入讲解如何使用Java编写身份证号验证的源代码。 首先,了解身份证号码的基本结构。中国的身份证号码前...

    C# TesseractOCR识别身份证号

    在IT领域,OCR(Optical Character Recognition,光学字符识别)技术是一种将图像中的文本转换为机器编码文本的技术。Tesseract OCR是由Google维护的一个开源OCR引擎,它能够识别多种语言的文本,包括身份证上的数字...

    【GIS应用】自定义转换器-使用FME验证身份证号码.zip

    身份证号码在中国是个人身份的重要标识,由18位数字组成,包含了出生日期、性别、地区代码等信息。在GIS数据处理中,确保身份证号码的正确性至关重要,以免引入错误信息。通过FME自定义转换器,我们可以添加特定的...

    身份证15位转18位的JSP实现方法整理.pdf

    "身份证15位转18位的JSP实现方法整理" 身份证号码是一种重要的身份识别号码,在中国大陆地区,每个公民都拥有一个唯一的身份证号码。身份证号码的格式是根据GB11643-1999《公民身份号码》标准规定的,该标准规定了...

    VC批量转化EXCEl中的15位身份证然后转化成18位

    在这个特定的案例中,我们面对的是一个VC(Visual C++)项目,它涉及到对Excel文件中的15位身份证号码进行批量升级到18位的过程。这是一个典型的字符串处理问题,涉及到编程和Excel数据操作的知识点。以下是对这个...

    身份证号验证程序javascript

    - **身份证号码长度检查**:如果身份证号码长度小于15位、等于16位、等于17位或者大于18位,则提示“证书必须是15位或18位”并返回。 - **身份证号码格式检查**:如果身份证号码不符合正则表达式`^\d{17}(\d|x)$`...

    根据身份证号自动输出相关信息(籍贯,出身日期,性别)

    首先,身份证号码的结构是有规律的,总共18位,分为三部分:前6位代表地区码,接下来的8位是出生日期,最后4位是顺序码和校验码。地区码可以对应到具体的省份、城市和区县,因此可以通过地区码获取用户的籍贯信息。 ...

    身份证号码相关的excel函数应用实例.zip

    标准的18位身份证号码应该满足`=LEN(A2)=18`。 5. **IF和ISNUMBER函数**:组合使用这两个函数可以检查身份证号码是否有效。例如,`=IF(ISNUMBER(VALUE(A2)), "有效", "无效")`,如果A2中的号码可以转换为数字且长度...

Global site tag (gtag.js) - Google Analytics