身份证号码18位与15位转换
身份证18位与15位转换package cn.crediteasep.tools.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import https://www.360docs.net/doc/e019064121.html,ng.StringUtils;
/**
* 身份证工具类
* @author Kobe
* @version 2020-08-08
*/
public class IdcardUtils extends StringUtils {
/** 中国公民身份证号码最小长度。*/
public static final int CHINA_ID_MIN_LENGTH = 15;
/** 中国公民身份证号码最大长度。*/
public static final int CHINA_ID_MAX_LENGTH = 18;
/** 省、直辖市代码表*/
public static final String cityCode[] = {
"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", "91"
};
/** 每位加权因子*/
public static final int power[] = {
7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
};
/** 第18位校检码*/
public static final String verifyCode[] = {
"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"
};
/** 最低年限*/
public static final int MIN = 1930;
public static Map
/** 台湾身份首字母对应数字*/
public static Map
/** 香港身份首字母对应数字*/
public static Map
static {
cityCodes.put("11", "北京");
cityCodes.put("12", "天津");
cityCodes.put("13", "河北");
cityCodes.put("14", "山西");
cityCodes.put("15", "内蒙古");
cityCodes.put("21", "辽宁");
cityCodes.put("22", "吉林");
cityCodes.put("23", "黑龙江");
cityCodes.put("31", "上海");
cityCodes.put("32", "江苏");
cityCodes.put("33", "浙江");
cityCodes.put("34", "安徽");
cityCodes.put("35", "福建");
cityCodes.put("37", "山东"); cityCodes.put("41", "河南"); cityCodes.put("42", "湖北"); cityCodes.put("43", "湖南"); cityCodes.put("44", "广东"); cityCodes.put("45", "广西"); cityCodes.put("46", "海南"); cityCodes.put("50", "重庆"); cityCodes.put("51", "四川"); cityCodes.put("52", "贵州"); cityCodes.put("53", "云南"); cityCodes.put("54", "西藏"); cityCodes.put("61", "陕西"); cityCodes.put("62", "甘肃"); cityCodes.put("63", "青海"); cityCodes.put("64", "宁夏"); cityCodes.put("65", "新疆"); cityCodes.put("71", "台湾"); cityCodes.put("81", "香港"); cityCodes.put("82", "澳门"); cityCodes.put("91", "国外");
twFirstCode.put("B", 11); twFirstCode.put("C", 12); twFirstCode.put("D", 13); twFirstCode.put("E", 14); twFirstCode.put("F", 15); twFirstCode.put("G", 16); twFirstCode.put("H", 17); twFirstCode.put("J", 18); twFirstCode.put("K", 19); twFirstCode.put("L", 20); twFirstCode.put("M", 21); twFirstCode.put("N", 22); twFirstCode.put("P", 23); twFirstCode.put("Q", 24); twFirstCode.put("R", 25); twFirstCode.put("S", 26); twFirstCode.put("T", 27); twFirstCode.put("U", 28); twFirstCode.put("V", 29); twFirstCode.put("X", 30); twFirstCode.put("Y", 31);
twFirstCode.put("Z", 33);
twFirstCode.put("I", 34);
twFirstCode.put("O", 35);
hkFirstCode.put("A", 1);
hkFirstCode.put("B", 2);
hkFirstCode.put("C", 3);
hkFirstCode.put("R", 18);
hkFirstCode.put("U", 21);
hkFirstCode.put("Z", 26);
hkFirstCode.put("X", 24);
hkFirstCode.put("W", 23);
hkFirstCode.put("O", 15);
hkFirstCode.put("N", 14);
}
/**
* 将15位身份证号码转换为18位* @param idCard
* 15位身份编码
* @return 18位身份编码
*/
public static String conver15CardTo18(String idCard) {
String idCard18 = "";
if (idCard.length() != CHINA_ID_MIN_LENGTH) {
return null;
}
if (isNum(idCard)) {
// 获掏诞生年月日
String birthday = idCard.substring(6, 12);
Date birthDate = null;
try {
birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
if (birthDate != null)
cal.setTime(birthDate);
// 获掏诞生年(完全表现形式,如:2020)
String sYear = String.valueOf(cal.get(Calendar.YEAR));
idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8);
// 转换字符数组
char[] cArr = idCard18.toCharArray();
if (cArr != null) {
int[] iCard = converCharToInt(cArr);
int iSum17 = getPowerSum(iCard);
// 获取校验位
String sVal = getCheckCode18(iSum17);
if (sVal.length() > 0) {
idCard18 += sVal;
} else {
return null;
}
}
} else {
return null;
}
return idCard18;
}
/**
* 将18位身份证号码转换为15位
* @param idCard
* 18位身份编码
* @return 15位身份编码
*/
public static String conver18CardTo15(String idCard) { String idCard15 = "";
if (idCard.length() != CHINA_ID_MAX_LENGTH) { return null;
}
StringBuffer sb = new StringBuffer(idCard);
sb.deleteCharAt(17);
sb.deleteCharAt(7);
sb.deleteCharAt(6);
idCard15 = sb.toString();
return idCard15;
}
/**
* 验证身份证是不是合法
*/
public static boolean validateCard(String idCard) { String card = idCard.trim();
if (validateIdCard18(card)) {
return true;
}
if (validateIdCard15(card)) {
return true;
}
String[] cardval = validateIdCard10(card);
if (cardval != null) {
if (cardval[2].equals("true")) {
return true;
}
}
return false;
}
/**
* 验证18位身份编码是不是合法
*
* @param idCard 身份编码
* @return 是不是合法
*/
public static boolean validateIdCard18(String idCard) { boolean bTrue = false;
if (idCard.length() == CHINA_ID_MAX_LENGTH) { // 前17位
String code17 = idCard.substring(0, 17);
// 第18位
String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH);
if (isNum(code17)) {
char[] cArr = code17.toCharArray();
if (cArr != null) {
int[] iCard = converCharToInt(cArr);
int iSum17 = getPowerSum(iCard);
// 获取校验位
String val = getCheckCode18(iSum17);
if (val.length() > 0) {
if (val.equalsIgnoreCase(code18)) {
bTrue = true;
}
}
}
}
}
return bTrue;
}
/**
* 验证15位身份编码是不是合法
*
* @param idCard
* 身份编码
* @return 是不是合法
*/
public static boolean validateIdCard15(String idCard) {
if (idCard.length() != CHINA_ID_MIN_LENGTH) {
return false;
}
if (isNum(idCard)) {
String proCode = idCard.substring(0, 2);
if (cityCodes.get(proCode) == null) {
return false;
}
String birthCode = idCard.substring(6, 12);
Date birthDate = null;
try {
birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2));
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
if (birthDate != null)
cal.setTime(birthDate);
if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)),
Integer.valueOf(birthCode.substring(4, 6)))) {
return false;
}
} else {
return false;
}
return true;
}
/**
* 验证10位身份编码是不是合法
*
* @param idCard 身份编码
* @return 身份证信息数组
*
* [0] - 台湾、澳门、香港[1] - 性别(男M,女F,未知N) [2] - 是不是合法(合
法true,不合法false)
* 假设不是身份证件号码那么返回null
*
*/
public static String[] validateIdCard10(String idCard) {
String[] info = new String[3];
String card = idCard.replaceAll("[\\(|\\)]", "");
if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) { return null;
}
if (idCard.matches("^[a-zA-Z][0-9]{9}$")) { // 台湾
info[0] = "台湾";
System.out.println("11111");
String char2 = idCard.substring(1, 2);
if (char2.equals("1")) {
info[1] = "M";
System.out.println("MMMMMMM");
} else if (char2.equals("2")) {
info[1] = "F";
System.out.println("FFFFFFF");
} else {
info[1] = "N";
info[2] = "false";
System.out.println("NNNN");
return info;
}
info[2] = validateTWCard(idCard) ? "true" : "false";
} else if (idCard.matches("^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?$")) { // 澳门info[0] = "澳门";
info[1] = "N";
// TODO
} else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$")) { // 香港info[0] = "香港";
info[1] = "N";
info[2] = validateHKCard(idCard) ? "true" : "false";
} else {
return null;
}
return info;
}
/**
* 验证台湾身份证号码
*
* @param idCard
* 身份证号码
* @return 验证码是不是符合
*/
public static boolean validateTWCard(String idCard) {
String start = idCard.substring(0, 1);
String mid = idCard.substring(1, 9);
String end = idCard.substring(9, 10);
Integer iStart = twFirstCode.get(start);
Integer sum = iStart / 10 + (iStart % 10) * 9;
char[] chars = mid.toCharArray();
Integer iflag = 8;
for (char c : chars) {
sum = sum + Integer.valueOf(c + "") * iflag;
iflag--;
}
return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false;
}
/**
* 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)
*
* 身份证前2位为英文字符,若是只显现一个英文字符那么表示第一名是空格,对应数字58 前2位英文字符A-Z别离对应数字10-35
* 最后一名校验码为0-9的数字加上字符"A","A"代表10
*
*
* 将身份证号码全数转换为数字,别离对应乘9-1相加的总和,整除11那么证件号码有效
*
*
* @param idCard 身份证号码
* @return 验证码是不是符合
*/
public static boolean validateHKCard(String idCard) {
String card = idCard.replaceAll("[\\(|\\)]", "");
Integer sum = 0;
if (card.length() == 9) {
sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9
+ (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8;
card = card.substring(1, 9);
} else {
sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8;
}
String mid = card.substring(1, 7);
String end = card.substring(7, 8);
char[] chars = mid.toCharArray();
Integer iflag = 7;
for (char c : chars) {
sum = sum + Integer.valueOf(c + "") * iflag;
iflag--;
}
if (end.toUpperCase().equals("A")) {
sum = sum + 10;
} else {
sum = sum + Integer.valueOf(end);
}
return (sum % 11 == 0) ? true : false;
}
/**
* 将字符数组转换成数字数组
*
* @param ca
* 字符数组
* @return 数字数组
*/
public static int[] converCharToInt(char[] ca) {
int len = ca.length;
int[] iArr = new int[len];
try {
for (int i = 0; i < len; i++) {
iArr[i] = Integer.parseInt(String.valueOf(ca[i]));
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return iArr;
}
/**
* 将身份证的每位和对应位的加权因子相乘以后,再取得和值*
* @param iArr
* @return 身份证编码。
*/
public static int getPowerSum(int[] iArr) {
int iSum = 0;
if (power.length == iArr.length) {
for (int i = 0; i < iArr.length; i++) {
for (int j = 0; j < power.length; j++) {
if (i == j) {
iSum = iSum + iArr[i] * power[j];
}
}
}
}
return iSum;
}
/**
* 将power和值与11取模取得余数进行校验码判定
*
* @param iSum
* @return 校验位
*/
身份证正确检验及验证公式
验证公式一 =IF(LEN(H20)=18,IF(RIGHT(H20,1)="X",IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18) )*7 LEFT(RIGHT(H20,17))*9 LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2 LEFT(RIGHT(H20,11))*1 LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3 LEFT(RIGHT(H20,8))*7 LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10 LEFT(RIGHT(H20,5))*5 LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4 LEFT(RIGHT(H20,2))*2),11) 1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1)),"正确!","出错啦! "),IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18))*7 LEFT(RIGHT(H20,17))*9 LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2 LEFT(RIGHT(H20,11))*1 LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3 LEFT(RIGHT(H20,8))*7 LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10 LEFT(RIGHT(H20,5))*5 LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4 LEFT(RIGHT(H20,2))*2),11) 1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1))*1,"正确!","出错啦!")),IF(LEN(H20)=15,"老号,请注意!",IF(LEN(H20)=0,"缺号码","位数不对!"))) 验证公式二 =MID("10X98765432",MOD(SUMPRODUCT(MID(H20,ROW(INDIRECT("1:17")),1)*2^(18 -ROW(INDIRECT("1:17")))),11) 1,1)=RIGHT(H20,1) 身份证有15位和18位两种,身份证位数是否正确,我们可以用LEN函数判断。但身份证上的日期是否合法:月份是否在1-12之间,日期是否在1-31之间,并且2月份只有28或29天,其他月份30或31天,都不能超过范围。另外一般规定6岁以上才可以办理身份证,也就是年份也有一个超范围的可能性。综合起来看,有三类错误:“身份证位数不对”、“月日错误”、“年份错误”。 假定身份证号码在B1单元格,下面的公式可以综合判断以上三种错误: 验证公式三 =IF(OR(LEN(B1)=18,LEN(B1)=15),IF(LEN(B1)=18,IF(OR(MONTH(DATE(1*(MID(B1,7 ,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,11,2)),DAY(DATE(1*(M ID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,13,2))),"月日错误",""),IF(LEN(B1)=15,IF(OR(MONTH(DATE(1*(MID(B1,7,2)) 1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,9,2)),DAY(DATE(1*(MID (B1,7,2)) 1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,11,2))),"月
常用表格公式
常用表格公式 1、=MID(C3,7,4)&"-"&MID(C3,11,2)&"-"&MID(C3,13,2) 表格中设置由身份证号码生成出生日期, C3为身份证号栏 2、要求A4是身份证号E4出生年月F4年龄(以下公式15、18位号码通用) E4 =TEXT(MID(A4,7,6+2*(LEN(A4)=18)),"#00年00月00日") F4 =DATEDIF(TEXT(MID(A4,7,6+2*(LEN(A4)=18)),"#00-00-00"),TODAY(),"y") 3、=IF(MOD(IF(LEN(C3)=15,MID(C3,15,1),MID(C3,17,1)),2)=1,"男","女")表格中设置由身份证号码生成性别15位18位通用 =IF(LEN(E3)=15,REPLACE(E3,7,,19)&MID("10X98765432",MOD(SUMPRODUCT(MID(RE PLACE(E3,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),E3)身份证15位转换为18位公式 EXCEL中如何提取身份证出生日期和性别信息以及检验身份证号码的正确性 中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为:15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码。 18位:6位数字常住户口所在县市的行政区划代码,8位数字出生日期代码,3位数字顺序码和1位检验码。 其中3位数字顺序码,是为同一地址码的同年同月同日出生人员编制的顺序号,偶数的为女性,奇数的为男性。 1、提取籍贯地区的行政区划代码(A2为身份证号,下同) 15与18位通用:=LEFT(A2,6) 如果有一个编码和省份地区的对照表,可以用VLOOKUP函数来提取地区信息。 2、提取出生日期信息 15位:=--TEXT(19&MID(A2,7,6),"#-00-00") 18位:=--TEXT(MID(A2,7,8),"#-00-00") 15与18位通用: =--TEXT(IF(LEN(A2)=15,19,"")&MID(A2,7,6+IF(LEN(A2)=18,2,0)),"#-00-00") 简化公式:=--TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00") (请将输入公式的单元格格式设置为日期格式) 3、提取性别信息 15位:=IF(MOD(RIGHT(A2),2)=1,"男","女")
15位数身份证升级方法
第一步: 身份证号码数据挪到A列,插入一列空白列B列,B1输入=LEN(A1)后向下拉。筛选出15位的老身份证 重新做个表 第二步: 身份证号码数据挪到A列,插入一列空白列B列,B1输入公式 =IF(LEN(A1)=15,CONCATENATE(MID(A1,1,6),"19",MID(A1,7,9),MID("10X98765432",MO D(MID(A1,1,1)*7+MID(A1,2,1)*9+MID(A1,3,1)*10+MID(A1,4,1)*5+MID(A1,5,1)*8+MID(A1 ,6,1)*4+1*2+9*1+MID(A1,7,1)*6+MID(A1,8,1)*3+MID(A1,9,1)*7+MID(A1,10,1)*9+MID(A1, 11,1)*10+MID(A1,12,1)*5+MID(A1,13,1)*8+MID(A1,14,1)*4+MID(A1,15,1)*2,11)+1,1)),A1) 这样15位身份证号码就变成了18位。 这个表保存好设为:表一(后面VLOOKUP函数用的上) 第三步:将做好的身份信息进行批量联网核查。 第四步:批量联网核查正确的即可做远程授权核实: 有两个方法:一、在60465里面直接输入15位身份证号,18位数的减成15位的大家肯定都会输二、如果想在60465里面输客户号,可用VOOKLUP函数在第二步“表一”里面将客户号对应。VLOOKUP函数用法不好描述请百度 (提示:在验证公式正确性时,很多身份证号通过这个公式错了,有可能是倒第二位数字本来网点原来就录错了与公式无关。) 参考资料: 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 B2=RIGHT(A2,1) 例如身份证号在A2单元,在B2单元格用上述函数可以取出身份号尾数的X,然后向下拖就可以取出所有的尾数X。 C2=CODE(B2),可以在C列取出大X和小X的不同值,然后就可以将小X和大X区分开。
身份证号码换算年龄、性别、出生日期的公式
15位和18位的身份证号都合适的了。设内容如下: ........A列......B列......C列......D列.... 1 身份证号性别出生年月年龄 2(输入身份证号) 算年龄的: “=IF(OR(LEN(A2)=15,LEN(A2)=18),RIGHT(IF(IF(LEN(A2)=15,MID(A2,9,2),MID(A2,11,2) )*100+IF(LEN(A2)=15,MID(A2,11,2),MID(A2,13,2))>MONTH(TODAY())*100+DAY(TODA Y()),YEAR(TODAY())-IF(LEN(A2)=15,MID(A2,7,2),MID(A2,9,2))-1,YEAR(TODAY())-IF(L EN(A2)=15,MID(A2,7,2),MID(A2,9,2))),2),"证号错误")” 算性别的: “=IF(LEN(A2)=15,(IF(OR(ABS(RIGHT(A2))=1,ABS(RIGHT(A2))=3,ABS(RIGHT(A2))=5,A BS(RIGHT(A2))=7,ABS(RIGHT(A2))=9),"男","女 ")),(IF(OR(ABS(MID(A2,17,1))=1,ABS(MID(A2,17,1))=3,ABS(MID(A2,17,1))=5,ABS(MID( A2,17,1))=7,ABS(MID(A2,17,1))=9),"男","女")))” 算出生年月的: “=DATE(IF(LEN(E3)=15,MID(E3,7,2),MID(E3,9,2)),IF(LEN(E3)=15,MID(E3,9,2),MID(E3,1 1,2)),IF(LEN(E3)=15,MID(E3,11,2),MID(E3,13,2)))” 只要把输入身份证号的单元格格式设为“文本”就是最关键的,准确。 注:A2、E3是身份证号所在列和行,应相应改动 另一种方法 =DATEDIF(TEXT((LEN(A1)=15)*19&MID(A1,7,6+(LEN(A1)=18)*2),"00-00-00"),TODAY() ,"y" ) A1是身份证号,在B1中输入上面的公式试试 在Excel中按身份证号码提出一定年龄段的人出来 在Excel中,有一个几千人的工作表,现在我想把工作表中满70岁的人员提出来,能依靠的条件就是身份证。而身份证号有十八位号和十五位号两种。也就是说,要依据身份证号找出在36年之前出生的人,该如何操作。 假设你的表格中从A3单元格开始填写身份证号码,那么可在该列后面插入一列,即B列,在B3输入公式:=IF(LEN(A3)=18,MID(A3,7,4),"19"&MID(A3,7,2)) 。将公式拖动复制到需要的行。这时选中该列——右键——复制——在原位(B3)单击右键——选择性粘贴——选数值——确定(该步骤目的是将公式列变为数字列,便于筛选)。现在,选中第二行——数据——筛选——自动筛选——在B列的下拉菜单中选“自定义”——在“显示行”的相应框中输入“小于或等于”-“1936”——确定。所有在1936年及其以后出生的就筛选出来了。注意:以上公式既适合18位,又适合15位身份证号码提取年份。
身份证核对公式
EXCEL中你输入的公民身份号码正确吗? 目录:1、输入错误自动红色显示提示 2、15位身份证号码升位为18位公民身份号码 3、自动生成出生日期和性别 4、中华人民共和国国家标准GB 11643-1999 公民身份号码 一、输入错误自动红色显示提示 在企业报送的EXCEL电子表格中,经常遇到公民身份号码输入错误而给工作带来不必要的麻烦,降低了工作效率。 有没有办法在公民身份号码录入错误时进行自动提示呢? 其实【中华人民共和国国家标准 GB 11643-1999】对公民身份号码第18位校验码已作了详细的规定,只是我们在电算工作中很少用到而已。 可用以下方法在EXCEL中录入公民身份号码错误时自动红字显示: 选择需要录入公民身份号码的单元格(如A1),选择菜单:格式/条件格式。 ①点击条件1左边的下拉箭头,选择公式,在右边的公式栏中输入以下公式: =AND(LEN(D4)<>0,LEN(D4)<>15,LEN(D4)<>18) 接着单击格式,点击字体,颜色选择红色,确定。 ②在条件格式中点添加,点击条件2左边的下拉箭头,选择公式,在右边的公式栏中输入以下公式: =MID("10X98765432",MOD(SUMPRODUCT(MID(D4,ROW($1:$17),1)*MOD(2^(18-ROW($1:$17)),11) ),11)+1,1)<>MID(D4,18,1) 接着单击条件2中的格式,点击字体,颜色选择红色,确定,确定。 右键按住A1单元格右下角的小黑点,向下拖至所需要录入公民身份号码的所有单元格,松开右键,选择仅填充格式。 在接着的录入中,凡是输入不是15位或18位,或者输入18位错误的公民身份号码都会红色显示。 身份证重复显蓝色的公式:COUNTIF($D$4:$D$65536,D4)>1 二、15位身份证号码升位为18位公民身份号码 要使单元格中A1中的15位身份证号码升位为18位公民身份号码,只需在单元格A2中输入以下公式即可: =REPLACE(A1,7,,19)&MID("10X98765432",MOD(SUMPRODUCT(MID(REPLACE(A1,7,,19),ROW($1:$1 7),1)*MOD(2^(18-ROW($1:$17)),11)),11)+1,1)
身份证号码的组成
身份证号码的组成 目前我国公民身份证号码由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,第18位为校验码。检验码分别是“0、1、2、……10”共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数码。 当今的身份证号码有15位和18位之分。1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。这两种身份证号码将在相当长的一段时期内共存。两种身份证号码的含义如下: 18位的身份证号码如:130429####%%%%0078 1~6位为地区代码,其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。如13(河北省)04(邯郸市)29(永年县) 7~14位为出生年月日 15~17位为顺序号,是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:007的就是个男生而且和他同年月日生的男生至少有两个他们的后四位是001* 和003* 18位为效验位(识别码),通过复杂公式算出,普遍采用计算机自动生成。是前面17位的一种检验代码,如果你改变了前面某个数字而后面的效验代码不响应改变就会被计算软件判断为非法身份正号码。X也是效验代码的一中 15位的身份证号码: (1)1~6位为地区代码 (2)7~8位为出生年份(2位),9~10位为出生月份,11~12位为出生日期 (3)第13~15位为顺序号,并能够判断性别,奇数为男,偶数为女。
身份证号码不一样有两种可能
身份证号码不一样有两种可能: 1、正常升位,原来15位,在出生日期前加19,在最后一位上加个校验码,这种情况属于正常升位,对自己今后办事没有任何影响。 2、号码错误,有些身份证在升位的时候会发现和别人的号码重号,这个时候公安局就会将重号的号码更改,虽然也升位,但是升位后号码已经不是按正常的升位情况得来。这时就需要户籍所在地的派出所开具证明,凡按照以前身份证号码所办的事情都要拿证明去更改,比如银行卡、驾驶证之类 应该是你和别人的身份证号重复了,第一代身份证号是手工编号,没有全国联网,人为原因造成号码重复、错误,办理第二代身份证时改成全国联网电脑编号,电脑自动识别重号,要把重复的号换掉,重新编号,所以你就可能有了个新身份证号。 既然对方已经先办了二代证,那只好给你重新编身份证号,当然新旧号就不一样了。如果新旧号不一样,主要影响你用旧号办的其他证件或业务,比如银行,毕业证,驾驶证等等。 拿新旧号码的身份证去常住户口所在地办理变更手续,那里有制式的表格,填好盖章,凭身份证号码变更证明去银行、学校、社保等用过原来旧号的地方更改相关证件上的身份证号。 我的毕业证书身份证号和现在的身份证号不一样怎么办啊 分享| 2009-07-23 14:09 匿名|浏览4379 次 我的毕业证书是05年毕业的是原来的一代身份证号也是18位的,可是现在的身份证也是18位的但是号码除了出生日期和地点一样,其他的全部不一样,这怎么办啊,希望咨询大家。高分悬赏。 我原来的身份证号是411403*****8710,现在的是412322****8758,都是18位的。弄的我现在毕业证都没有办法使用了,人家就不承认是一个人的。麻烦大家告诉我怎么办,该找谁啊。我去老家的派出所和公安分局找了,他们说只能这样,我的原来的号码让别人占用了,改不了,最多开个证明,怎么能让别人占用呢,一个具体家庭地址和出生日期的就我自己啊,现在很郁闷,高分悬赏解决办法,谢谢大家。 2009-07-23 20:40 提问者采纳 这个问题都集中在二代证换证过程中,可以说很普遍了,所以不用担心,并不是只有你一个人出现了这个情况,很多人都有,而且国家户政部门已经给出了一个解决方案,就是由你户口所在地的公安局开出身份证明,将你过去的老证号码以及新证号码都写在证明里,说明你的新证换证过程中替换了老证的号码,是同一个人,并将你的地址都写清楚,然后记得保留好你的这个身份证明文件,以后遇到了类似的证件与身份证冲突的事情,就拿出你的身份证明文件,就可以了,但是这个证明文件必须要有公安局的盖章才能有效,所有记得要将这个文件保管好就可以,不需要特别担心,已经有很多人都有这个问题出现了,只是以后你的所有证件办理都要用二代证上的号码为准来办理就可以了,已经凭老证办理了的就出具你的身份证明文件就好了。
两个关于身份证号码的EXCEL小函数
两个关于身份证号码的EXCEL小函数 办公室工作中,经常要进行员工身份证号码的录入(比如员工参加各类考试时填写报名表、录入个人养老保险及医疗保险金信息等等)。本人在工作中,为了提高身份证号码录入的效率和质量,设计了两个关于身份证号码的EXCEL函数“IDcard_15to18”和“IDcard_Check”,分别实现这样的功能:1、当需要录入某人员的新身份证号码,手头只有该人员工的15位老身份证号码,可用“IDcard_15to18”函数将老号码转换成新号码。2、当在EXCEL表格中手工录入完全部人员的18位新身份证号码后,如果不能确保录入的正确性,可用“IDcard_Check”函数进行正确性校验。“IDcard_15to18”函数的实现原理是:15位老身份证号码的第6、7位之间加上出生年份的前两位(“19”或“20”)得到17位号码,用这17位号码根据公式计算得出校验位(新身份证号码的第18位),即得到18位的新身份证号码(详细转换规则见附件2)。“IDcard_Check”函数的实现原理是:用新身份证号码的前17位计算得出校验位,再将计算得出的校验位和实际检验位比较,如果相等,则校验正确,否则该身份证号码有错。该函数中还加入了出生日期的检验,如出生月份不在1到12之间,则报错。 实现方法如下: 打开存有身份证号码的表格,在菜单中选择“工具(T)”-“宏(M)”-“V isual Basic 编辑器”,打开V isual Basic编辑器,在编辑器菜单中选择“插入(I)”-“模块(M)”,打开模块窗口,这时光标停留在模块窗口内。将“附件1:函数代码”的内容全部复制到模块窗口内,点磁盘图标保存,然后关闭编辑器,函数建立完成。 选中存有身份证号码的EXCEL表格,在菜单中选“插入(I)”-“函数(F)”,出现插入函数窗口(见下图),在函数窗口的“或选择类别”后选择“用户定义”,出现刚才定义的两个函数的名称“IDcard_15to18”和“IDcard_Check”,“IDcard_15to18”函数用来将老身份证号码转换为新身份证号码,这个函数有两个参数,第一个参数为要转换的15位老身份证号码,第二个参数为4位出生年份的前两位,例如B3单元格中存有一15位老身份证号码,并知此人的出生年份为“19XX”年,可在B4单元格中录入“=IDcard_15to18(b2,19)”,即得到此人的18位新身份证号码;“IDcard_Check”函数用来校验18位身份证号的一致性,例如B3单元格中存有一新身份证号,在可在B4单元格中录入“=IDcard_Check(B2)”对该号码进行校验,如检验正确则显示“校验正确!”,否则显示“此身份证号有误!”。这两个函数和普通EXCEL函数用法相同,可以拖放来实现身份证号的批量生成和校验。
身份证号转换
方法一: 15位身份证号:410881********* 输出出生日期1979/06/05 =CONCATENATE("19",MID(E2,7,2),"/",MID(E2,9,2),"/",MID(E2,11,2)) 公式解释: a.MID(E2,7,2)为在身份证号码中获取表示年份的数字的字符串 b. MID(E2,9,2) 为在身份证号码中获取表示月份的数字的字符串 c. MID(E2,11,2) 为在身份证号码中获取表示日期的数字的字符串 d.CONCATENATE("19",MID(E2,7,2),"/",MID(E2,9,2),"/",MID(E2,11,2))目的就是将多个字符串合并在一起显示。 18位身份证号:410881************ 输出出生日期1979/06/05 =CONCATENATE(MID(E2,7,4),"/",MID(E2,11,2),"/",MID(E2,13,2)) 方法二: 15位身份证号:410881********* 出生日期790605 =IF(LEN(E3)=15,MID(E3,7,6),MID(E3,9,6)) 18位身份证号:410881************ 出生日期790605 =IF(LEN(E3)=15,MID(E3,7,6),MID(E3,9,6)) 公式解释: LEN(E2)=15:检查E2单元格中字符串的字符数目,本例的含义是检查身份证号码的长度是否是15位。 MID(E2,7,6):从E2单元格中字符串的第7位开始提取6位数字,本例中表示提取15位身份证号码的第7、8、9、10、11、12位数字。 MID(E2,9,6):从C2单元格中字符串的第9位开始提取6位数字,本例中表示提取18位身份证号码的第9、10、11、12、13、14位数字。 =IF(LEN(E2)=15,MID(E2,7,6),MID(E2,9,6)):IF是一个逻辑判断函数,表示如果额E2单元格是15位,则提取第7位开始的6位数字,如果不是15位则提取自第9位开始的6位数字。 根据身份证号码自动生成性别: 方法一: 在C列输入身份证号,在B列填写性别,可以在B2单元格中输入公式
身份证access转换(使用实例技巧)
Excel中将15位身份证号转换为18位其实并不复杂,下面请跟我们来输入一些公式。 假设A列自A2起是身份证号(15位或18位)。 1、身份证号全部改为18位,输入数组公式:=IF(LEN(A2)=15,REPLACE(A2,7,,19)&MID("10X98765432",MOD(SUM(MID(REPLACE(A2 ,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),A2) 注意:数组公式输入方法:输入公式后不要按回车,而是按Ctrl+Shift+Enter。 2、身份证号全部改为15位,输入公式:=IF(LEN(A2)=15,A2,LEFT(REPLACE(A2,7,2,),15)) 3、计算出生日期:=IF(A2"",TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00")+0,) 4、判断性别:=IF(A2"",IF(MOD(RIGHT(LEFT(A2,17)),2),"男","女"),) 注意:重新建立一个窗体,把下面非红色文字粘贴到代码区即可。蓝色文字是控件的名称,如果你添写身份证号的控名称是“证件号码”,那要把下面所有的“身份证号码”改为“证件号码”。可以把库发给我,我帮你做。 https://www.360docs.net/doc/e019064121.html,我的主页,支持一下点击率,上面有美女的。 我的邮箱:gy0503@https://www.360docs.net/doc/e019064121.html, 1、先把下列代码复制到代码窗口任意位置: Function idcode(sCode15 As String) As String Dim i As Integer Dim num As Integer Dim code As String num = 0 idcode = Left(sCode15, 6) + "19" + Right(sCode15, 9) For i = 18 To 2 Step -1 num = num + (2 ^ (i - 1) Mod 11) * (Mid(idcode, 19 - i, 1)) Next i num = num Mod 11 Select Case num Case 0 code = "1" Case 1 code = "0" Case 2 code = "X" Case Else code = Trim(Str(12 - num)) End Select idcode = idcode + code End Function
身份证提取数据 的方法
EXCEL中如何从身份证号码 提取出生年月日及性别 一、分析身份证号码 其实,身份证号码与一个人的性别、出生年月、籍贯等信息是紧密相连的,无论是15位还是18位的身份证号码,其中都保存了相关的个人信息。 15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。 18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。 例如,某学生的身份证号码(15位)是320521************,那么表示1989年8月7日出生,性别为女。如果能想办法从这些身份证号码中将上述个人信息提取出来,不仅快速简便,而且不容易出错,核对时也只需要对身份证号码进行检查,肯定可以大大提高工作效率。 二、转换身份证号码格式 我们先将学生的身份证号完整地输入到EXCEL表格中,
这时默认为“数字”格式(单元格内显示的是科学记数法的格式),需要更改一下数字格式。选中该列中的所有身份证号后,右击鼠标,选择“设置单元格格式”。在弹出对话框中“数字”标签内的“分类”设为“文本”,然后点击确定。 三、提取个人信息 这里,我们需要使用IF、LEN、MOD、MID、DATE等函数从身份证号码中提取个人信息。假设学生的身份证号码信息已输入完毕(C列),出生年月信息填写在D列,性别信息填写在B列。 1. 提取出生年月信息 如果上交报表时需要填写出生年月日,我们需要关心身份证号码的相应部位即可,即显示为“19890807”这样的信息。在D2单元格中输入公式 =IF(LEN(C2)=15,"19"&MID(C2,7,6),MID(C2,7,8)),其中: 文本函数MID返回文本字符串中从指定位置开始的特定数目的字符,该数目由用户指定。语法:MID(text,start_num,num_chars)即MID(文本,开始字符,所取字符数), Text 是包含要提取字符的文本字符串。 Start_num 是文本中要提取的第一个字符的位
身份证数字含义
身份证数字含义 我国自年实施公民身份号码制度以来,许多公民身份号码末位为“x”的公民,由于不明白“x”的含义,要求给予更换,产生了不必要的误会。 检验码分别是“0、1、2、……10”共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“x”表示。 虽然校验码为“x”无法更改,但若需全用数字则表示,只需将18十一位公民身份号码转换成15十一位居民身份证号码,换成第7至8位和最后1十一位3个数码。 当今的身份证号码有15位和18位之分。 年我国推行居民身份证制度,当时核发的身份证号码就是15位的,年核发的身份证由于年份的拓展(由两位变成四位)和末尾提了效验码,就变成了18十一位。 这两种身份证号码将在相当长的一段时期内共存。 两种身份证号码的含义如下: 18位的身份证号码如:####%%%% 1~6十六位地区代码,其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。 如13(河北省)04(邯郸市)29(永年县) 7~14十六位出生年月日 15~17位为顺序号,是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“-”或“-”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。 例如:的就是个男生而且和他同年月日后生的男生至少存有两个他们的后四位就是* 和 * 18位为效验位(识别码),通过复杂公式算出,普遍采用计算机自动生成。 就是前面17位的一种检验代码,如果你发生改变了前面某个数字而后面的效验代码不积极响应发生改变就可以被排序软件推论为非法身份正号码。 x也是效验代码的一中 15位的身份证号码: (1)1~6位为地区代码
身份证号码18位与15位转换
身份证18位与15位转换package cn.crediteasep.tools.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import https://www.360docs.net/doc/e019064121.html,ng.StringUtils; /** * 身份证工具类 * @author Kobe * @version 2020-08-08 */ public class IdcardUtils extends StringUtils { /** 中国公民身份证号码最小长度。*/ public static final int CHINA_ID_MIN_LENGTH = 15;
/** 中国公民身份证号码最大长度。*/ public static final int CHINA_ID_MAX_LENGTH = 18; /** 省、直辖市代码表*/ public static final String cityCode[] = { "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", "91" }; /** 每位加权因子*/ public static final int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; /** 第18位校检码*/ public static final String verifyCode[] = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; /** 最低年限*/