身份证15与18位相互转换的oracle plsql代码.sql
15位身份证号码转18位算法
15位⾝份证号码转18位算法⾝份证号码15位升18位⾝份证18位验证18位⾝份证标准在国家质量技术监督局于1999年7⽉1⽇实施的GB11643-1999《公民⾝份号码》中做了明确的规定。
GB11643-1999《公民⾝份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民⾝份号码",另外GB11643-1999《公民⾝份号码》从实施之⽇起代替GB11643-1989。
GB11643-1999《公民⾝份号码》主要内容如下:⼀、范围该标准规定了公民⾝份号码的编码对象、号码的结构和表现形式,使每个编码对象获得⼀个唯⼀的、不变的法定号码。
⼆、编码对象公民⾝份号码的编码对象是具有中华⼈民共和国国籍的公民。
三、号码的结构和表⽰形式1、号码的结构公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位校验码组成。
排列顺序从左⾄右依次为:六位数字地址码,⼋位数字出⽣⽇期码,三位数字顺序码和⼀位数字校验码。
2、地址码表⽰编码对象常住户⼝所在县(市、旗、区)的⾏政区划代码,按GB/T2260的规定执⾏。
3、出⽣⽇期码表⽰编码对象出⽣的年、⽉、⽇,按GB/T7408的规定执⾏,年、⽉、⽇代码之间不⽤分隔符。
4、顺序码表⽰在同⼀地址码所标识的区域范围内,对同年、同⽉、同⽇出⽣的⼈编定的顺序号,顺序码的奇数分配给男性,偶数分配给⼥性。
5、校验码(1)⼗七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和Ai:表⽰第i位置上的⾝份证号码数字值Wi:表⽰第i位置上的加权因⼦Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(2)计算模Y = mod(S, 11)(3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 2四、举例如下:北京市朝阳区: 110105************⼴东省汕头市: 44052418800101001415位升18的⽅法根据〖中华⼈民共和国国家标准 GB 11643-1999〗中有关公民⾝份号码的规定,公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位数字校验码组成。
ORACLE对身份证号码处理的相关SQL汇总
ORACLE对身份证号码处理相关的SQL汇总身份证号码算法及应用场景:工作实践总结,与大家分享快乐,并请高人批评指正,努力改进:目前我国大量存在着正在有效期的15位身份证,虽然国家在推行二代身份证,但尚未发现强行要求全国人民更换未到期的15位身份证的官方声明或公告。
扯远了:),总之合法的15位身份证号码将在今后一段时间内继续存在下去。
另外,项目中往往有着大量的历史数据,我们的一个系统中15位身份证所占比重很大,因此系统必须实现对两套身份证编码的职能处理,并支持另外一种特殊证件类型:军官证/警官证。
本文重点讨论15位/18位身份证的处理问题众所周知,我们现执行的身份证号码编码由公安部具体落实编码规则,有15位/18位两种,公安部以数学语言描述的方式公开了身份证编码规则和位码含义,但具体到计算机语言实现,需要开发人员自行根据算法设计。
本文主要以oracle的SQL为例子,其他语言大家可以自行转换,道理都是一样的。
这里以ORACLE为例,其他数据库类似:CREATE OR REPLACE function ID15TO18(p_OldID varchar2) return varchar2 istype TIArray is table of integer;type TCArray is table of char(1);Result varchar2(18);W TIArray;A TCArray;S integer;beginif Length(p_OldID) <> 15 OR NOT ISIDCARD(p_OldID) thenraise_application_error(-20999, '不是旧15位身份证号或者不是身份证号');Result := p_OldID;elseW := TIArray(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);A := TCArray('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');Result := SubStr(p_OldID, 1, 6) || '19' || SubStr(p_OldID, 7, 9);S := 0;beginfor i in 1 .. 17 loopS := S + to_number(SubStr(Result, i, 1)) * W(i);end loop;exceptionwhen others thenreturn '';end;S := S mod 11;Result := Result || A(s + 1);end if;return(Result);end ID15TO18;/CREATE OR REPLACE function isIDCard(p_IDcard varchar2) return boolean isIDcardlen integer;beginIDcardlen :=Length(p_IDcard);/*if (IDcardlen = 18 and IS_NUMBER(SubStr(p_IDcard, 1, IDcardlen-1))and IS_DATE (substr(p_IDcard,7,8)))or(IDcardlen = 15 and IS_NUMBER(SubStr(p_IDcard, 1, IDcardlen))and IS_DATE ('19' || subsTR(p_IDcard,7,6)))*/if (IDcardlen = 18)or(IDcardlen = 15 )thenreturn TRUE;ELSEreturn FALSE;end if;end isIDCard;/CREATE OR REPLACE FUNCTION is_number (str IN VARCHAR2)RETURN NUMBERISBEGINIF str IS NULLTHENRETURN 0;ELSEIF regexp_like (str, '^(-{0,1} {0,1})[0-9] (.{0,1}[0-9] )$')THENRETURN 1;ELSERETURN 0;END IF;END IF;END is_number;/CREATE OR REPLACE function getAge(p_IDcard varchar2) return integer is IDcardlen integer;IDcardyear integer;beginIDcardlen :=Length(p_IDcard);if isidcard(p_IDcard) and IDcardlen = 18 thenIDcardyear := to_number(substr(p_IDcard,7,4));end if;if isidcard(p_IDcard) and IDcardlen = 15 thenIDcardyear := to_number('19'||substr(p_IDcard,7,2));end if;return to_number(to_char(sysdate,'yyyy'))-IDcardyear;end getAge;/CREATE OR REPLACE function getSex(p_IDcard varchar2) return varchar2 is IDcardlen integer;beginIDcardlen :=Length(p_IDcard);if not isidcard(p_IDcard)thenreturn null;end if;if IDcardlen = 18 and Substr(p_IDcard,17,1) in (1,3,5,7,9) then return ('男');end if;if IDcardlen = 18 and Substr(p_IDcard,17,1) in (2,4,6,8,0)then return ('女');end if;if IDcardlen = 15 and Substr(p_IDcard,15,1) in (1,3,5,7,9) then return ('男');end if;if IDcardlen = 15 and Substr(p_IDcard,15,1) in (2,4,6,8,0)then return ('女');end if;end getSex;//* Formatted on 2009/05/22 13:35 (Formatter Plus v4.8.6) */ CREATE OR REPLACE FUNCTION is_date (in_date IN VARCHAR2) RETURN BOOLEANISv_date_value DATE;invalid_day EXCEPTION;invalid_month EXCEPTION;PRAGMA EXCEPTION_INIT (invalid_day, -1839);PRAGMA EXCEPTION_INIT (invalid_month, -1843);BEGINSELECT TO_DATE (in_date, 'YYYY-MM-DD')INTO v_date_valueFROM DUAL;RETURN TRUE;EXCEPTIONWHEN invalid_dayTHENRETURN FALSE;WHEN invalid_monthTHENRETURN FALSE;WHEN OTHERSTHENRETURN FALSE;END is_date;/。
身份证15位变18位
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
身份证15位转18位(SQL函数)
⾝份证15位转18位(SQL函数)USE [您的数据库名]GO/****** Object: UserDefinedFunction [dbo].[get18id] Script Date: 10/10/2014 16:32:15 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:-- Create date:-- Description:-- =============================================CREATE FUNCTION [dbo].[get18id](-- Add the parameters for the function here@id nvarchar(18))RETURNS nvarchar(18)ASBEGIN-- Declare the return variable hereDECLARE @myresult nvarchar(18),@ids nvarchar(17),@idindex int,@idsum int,@idcharnumber tinyint,@idmod int,@idlast char-- check input rightif(@id is null or @id='')beginRETURN nullendif(LEN(@id)<>15)beginif(LEN(@id)<>18)beginreturn nullendreturn @idendset @idindex=1;-- birthday year defoult is '19'set @ids=SUBSTRING(@id,1,6)+'19'+SUBSTRING(@id,7,9);--RETURN @ids;while(@idindex<=18)beginset @idcharnumber=convert(tinyint,SUBSTRING(@ids,@idindex,1));--return @idcharnumber;--print @idcharnumber+'\n';if(@idindex=1)beginset @idsum=7*@idcharnumber;--return @idsum;endelse if(@idindex=2)beginset @idsum+=9*@idcharnumber;endelse if(@idindex=3)beginset @idsum+=10*@idcharnumber; endelse if(@idindex=4)beginset @idsum+=5*@idcharnumber; endelse if(@idindex=5)beginset @idsum+=8*@idcharnumber; endelse if(@idindex=6)beginset @idsum+=4*@idcharnumber; endelse if(@idindex=7)beginset @idsum+=2*@idcharnumber; endelse if(@idindex=8)beginset @idsum+=1*@idcharnumber; endelse if(@idindex=9)beginset @idsum+=6*@idcharnumber; endelse if(@idindex=10)beginset @idsum+=3*@idcharnumber; endelse if(@idindex=11)beginset @idsum+=7*@idcharnumber; endelse if(@idindex=12)beginset @idsum+=9*@idcharnumber; endelse if(@idindex=13)beginset @idsum+=10*@idcharnumber; endelse if(@idindex=14)beginset @idsum+=5*@idcharnumber; endelse if(@idindex=15)beginset @idsum+=8*@idcharnumber; endelse if(@idindex=16)beginset @idsum+=4*@idcharnumber; endelse if(@idindex=17)beginset @idsum+=2*@idcharnumber; endset @idindex=@idindex+1;--break;end--return @idsum;set @idmod=@idsum%11;if(@idmod=0)beginset @idlast='1';endelse if(@idmod=1)beginset @idlast='0';endelse if(@idmod=2)beginset @idlast='X';endelse if(@idmod=3)beginset @idlast='9';endelse if(@idmod=4)beginset @idlast='8';endelse if(@idmod=5)beginset @idlast='7';endelse if(@idmod=6)beginset @idlast='6';endelse if(@idmod=7)beginset @idlast='5';endelse if(@idmod=8)beginset @idlast='4';endelse if(@idmod=9)beginset @idlast='3';endelse if(@idmod=10)beginset @idlast='2';endset @myresult=@ids+@idlast; -- Return the result of the function RETURN @myresultENDGO。
身份证access转换(使用实例技巧)
身份证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),"男","女"),)注意:重新建立一个窗体,把下面非红色文字粘贴到代码区即可。
蓝色文字是控件的名称,如果你添写身份证号的控名称是“证件号码”,那要把下面所有的“身份证号码”改为“证件号码”。
可以把库发给我,我帮你做。
/doc/c214815838.html,我的主页,支持一下点击率,上面有美女的。
我的邮箱:gy0503@/doc/c214815838.html,1、先把下列代码复制到代码窗口任意位置:Function idcode(sCode15 As String) As StringDim i As IntegerDim num As IntegerDim code As Stringnum = 0idcode = Left(sCode15, 6) + "19" + Right(sCode15, 9)For i = 18 To 2 Step -1num = num + (2 ^ (i - 1) Mod 11) * (Mid(idcode, 19 - i, 1))Next inum = num Mod 11Select Case numCase 0code = "1"Case 1code = "0"Case 2code = "X"Case Elsecode = Trim(Str(12 - num))End Selectidcode = idcode + codeEnd Function2、如果你的数据很多,在成为当前的代码里,把15位号变为18位,再根据18位号码让性别显示男或女,然后设置计时器,在计时器触发事件里写入进入下一记录的代码,这样当你加载窗体里,数据会自动移动并更新,但到最后一条记录里会出现错误,因为到最后一条时,下一条记录是新添加记录,不过没关系,出现错误时按结束就行了。
身份证号码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 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<String, String> cityCodes = new HashMap<String, String>();/** 台湾身份首字母对应数字*/public static Map<String, Integer> twFirstCode = new HashMap<String, Integer>();/** 香港身份首字母对应数字*/public static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>();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 身份证信息数组* <p>* [0] - 台湾、澳门、香港[1] - 性别(男M,女F,未知N) [2] - 是不是合法(合法true,不合法false)* 假设不是身份证件号码那么返回null* </p>*/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,部份特殊身份证无法检查)* <p>* 身份证前2位为英文字符,若是只显现一个英文字符那么表示第一名是空格,对应数字58 前2位英文字符A-Z别离对应数字10-35* 最后一名校验码为0-9的数字加上字符"A","A"代表10* </p>* <p>* 将身份证号码全数转换为数字,别离对应乘9-1相加的总和,整除11那么证件号码有效* </p>** @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 身份证编码。
身份证验证及18与15之间转化
//身份证号系统#include <iostream>using namespace std;int main(){int n,i,y,m,s;int x[20];char a[20],b[15];x[1]=7;x[2]=9;x[3]=10;x[4]=5;x[5]=8;x[6]=4;x[7]=2;x[8]=1;x[9]=6;x[10]=3;x[11]=7;x[12]=9;x[13]=10;x[14]=5;x[15]=8;x[16]=4;x[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';b[7]='5';b[8]='4';b[9]='3';b[10]='2';do{cout<<"================================================================="<< endl;cout<<"==========================身份证号码验证程序====================="<< endl;cout<<"================================================================="<< endl;cout<<" 身份证号验证请按1"<< endl;cout<<" 18位身份证转换15位请按2"<< endl;cout<<" 15位身份证转化18位请按3"<< endl;cout<<" 身份证号分解显示请按4"<< endl;cout<<" 退出系统请按0"<< endl;cout<<"=================================================================="<< endl;cin>>n;switch(n){case 0:exit(0);case 1:{cout<<"请输入18位身份证"<<endl;s=0;for(i=1;i<=18;i++){cin>>a[i];}cout<<endl;for(i=1;i<=18;i++){cout<<a[i];}cout<<endl;for(i=1;i<=17;i++){m=a[i]-'0';s=s+m*x[i];}cout<<endl;y=s%11;if(b[y]==a[18])cout<<"身份证号码正确";else cout<<"输入的身份证号码有误";cout<<endl;break;}case 2:{cout<<"请输入18位身份证"<<endl;for(i=1;i<=18;i++){cin>>a[i];}cout<<endl;for(i=1;i<=18;i++){if(i!=7&&i!=8&&i!=18)cout<<a[i];}cout<<endl;break;}case 3:{cout<<"请输入15位身份证号";cout<<endl;s=0;for(i=1;i<=17;i++){if(i==7)a[i]='1';else if(i==8)a[i]='9';else cin>>a[i];}for(i=1;i<=17;i++){m=a[i]-'0';s=s+m*x[i];}cout<<endl;y=s%11;a[18]=b[y];for(i=1;i<=18;i++){cout<<a[i];}cout<<endl;break;}case 4:{cout<<"输入18位身份证号"<<endl;for(i=1;i<=18;i++){cin>>a[i];}cout<<endl;for(i=1;i<=18;i++){if(i<=6){cout<<"地址码为"<<a[i]<<endl;}else if(i<=14&&i>6){cout<<"出生日期为"<<a[i]<<endl;;}else if(i<=17&&i>14){cout<<"顺序码为"<<a[i]<<endl;;}else {cout<<"校验码位"<<a[i]<<endl;}}cout<<endl;break;}}}while(1);return 0;}//身份证号码系统//number.app#include <iostream>using namespace std;class number{public:number();//构造函数void jianyan();//检验身份证号void change1();//将18位身份证转化为15位void change2();//将15位身份证转化为18位void fenjie();//身份证号分解private:char num[20];//存储身份证号的数组};number::number()//构具体实现造函数的{int i;for(i=0;i<20;i++){num[i]='0';}}void number::jianyan()//的具体实现检验函数{int i,s,y,m;int w[20];//权值数组char b[15];//b数组位检验数组s=0;//累加求和w[1]=7;w[2]=9;w[3]=10;w[4]=5;w[5]=8;w[6]=4;w[7]=2;w[8]=1;w[9]=6;w[10]=3;//初始化ww[11]=7;w[12]=9;w[13]=10;w[14]=5;w[15]=8;w[16]=4;w[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"请输入18位身份证号码"<<endl;for(i=1;i<=18;i++)//将18位身份证存到num数组中{cin>>num[i];}for(i=1;i<=17;i++){m=num[i]-'0';//将num数组中的字符转化成数值s=s+m*w[i];//累加求出前17位身份证与其对应的的权值之和}cout<<endl;y=s%11;//算出余数if(b[y]==num[18])cout<<"身份证号码正确";//校验身份证哈是否正确else cout<<"输入的身份证号码有误";cout<<endl;}void number::fenjie()//分解函数的具体实现{int i,s,y,m;int w[20];//权值数组char b[15];//b数组位检验数组s=0;//累加求和w[1]=7;w[2]=9;w[3]=10;w[4]=5;w[5]=8;w[6]=4;w[7]=2;w[8]=1;w[9]=6;w[10]=3;//初始化ww[11]=7;w[12]=9;w[13]=10;w[14]=5;w[15]=8;w[16]=4;w[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"输入18位身份证号"<<endl;for(i=1;i<=18;i++)//将18位身证号份输入到num数组中{cin>>num[i];}for(i=1;i<=17;i++){m=num[i]-'0';//将num数组中的字符转化成数值s=s+m*w[i];//累加求出前17位身份证与其对应的的权值之和}cout<<endl;y=s%11;//算出余数if(b[y]!=num[18])cout<<"身份证号码错误"<<endl;//校验身份证号是否正确else{cout<<"输入的身份证号码正确";cout<<endl;cout<<"地址码为";for(i=1;i<=6;i++)//输出地址码{cout<<num[i];}cout<<endl;cout<<"出生年份为";for(i=7;i<=14;i++)//输出出生年月日{cout<<num[i];}cout<<endl;cout<<"顺序码为";for(i=15;i<=17;i++)//输出顺序码{cout<<num[i];}cout<<endl;cout<<"校验码为"<<num[18];//输出校验码cout<<endl;}}void number::change1()//将18位身份证号转化为15位{int i,s,y,m;int w[20];//权值数组char b[15];//b数组位检验数组s=0;//累加求和w[1]=7;w[2]=9;w[3]=10;w[4]=5;w[5]=8;w[6]=4;w[7]=2;w[8]=1;w[9]=6;w[10]=3;//初始化ww[11]=7;w[12]=9;w[13]=10;w[14]=5;w[15]=8;w[16]=4;w[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"请输入18位身份证"<<endl;for(i=1;i<=18;i++)//将18位身证号份输入到num数组中{cin>>num[i];}cout<<endl;for(i=1;i<=17;i++){m=num[i]-'0';//将num数组中的字符转化成数值s=s+m*w[i];//累加求出前17位身份证与其对应的的权值之和}cout<<endl;y=s%11;//算出余数if(b[y]==num[18]){cout<<"身份证号码正确";cout<<endl;for(i=1;i<=18;i++)//输出18位身份证号码中的15位{if(i!=7&&i!=8&&i!=18)cout<<num[i];}}//校验身份证哈是否正确else cout<<"输入的身份证号码有误";cout<<endl;}void number::change2()//将15位身份证号转化为18位{int i,m,y,s=0;char b[15];//权值数组bint x[20];//校验数组xx[1]=7;x[2]=9;x[3]=10;x[4]=5;x[5]=8;x[6]=4;x[7]=2;x[8]=1;x[9]=6;x[10]=3;//初始化x x[11]=7;x[12]=9;x[13]=10;x[14]=5;x[15]=8;x[16]=4;x[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"请输入15位身份证号";cout<<endl;for(i=1;i<=17;i++)//将输入的15位身份证号转化为17位{if(i==7)num[i]='1';else if(i==8)num[i]='9';else cin>>num[i];}for(i=1;i<=17;i++)//计算出前17位身份证号及其对应的权值之和{m=num[i]-'0';s=s+m*x[i];}cout<<endl;y=s%11;//求出余数ynum[18]=b[y];//求出第18位身份证号for(i=1;i<=18;i++)//输出18位身份证{cout<<num[i];}cout<<endl;}int fun()//主函数调用的函数,实现二级菜单{number mynumber;//建立类number的一个对象int n;//选择功能do{cout<<"******************************************************************** ***********"<< endl;cout<<"******************************身份证号码转化程序*******************************"<< endl;cout<<" 18位身份证转换15位请按1"<< endl;cout<<" 15位身份证转化18位请按2"<< endl;cout<<" 返回上一级请按0"<< endl;cout<<"************************************************************************ *******"<< endl;cin>>n;switch(n){case 0:return 0;case 1:{mynumber.change1();break;}case 2:{mynumber.change2();break;}}}while(1);return 0;}int main(){number mynumber;//建造number类的一个对象int n;//选择功能do{cout<<"******************************************************************** ************";cout<<"****************************身份证号码验证程序**********************************";cout<<"*******************************欢迎使用程序*************************************";cout<<" 身份证号验证请按1"<< endl;cout<<" 身份证互相转换请按2"<< endl;cout<<" 身份证号分解显示请按3"<< endl;cout<<" 退出系统请按0"<< endl;cout<<"************************************************************************ ********"<< endl;cin>>n;switch(n){case 0:exit(0);case 1:{mynumber.jianyan();break;}case 2:{fun();break;}case 3:{mynumber.fenjie();break;}}}while(1);return 0;}。
15号身份证号码转18位批量工具表
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
15位身份证升级为18位 并查询其信息
--15位身份证升级为18位并查询其信息create or replace procedure f_changecard(p_cert_num in varchar2)asv_cert_num varchar2(30);v_type varchar2(20);v_sum varchar2(10);--v_sum_m varchar2(10);v_yu varchar2(4);v_new varchar(30);v_nian varchar(4);v_yue varchar(4);v_ri varchar(4);v_sex varchar2(2);v_sf varchar2(10);v_sf_f varchar2(4);--v_yu_y varchar2(4);beginexecute immediate'select length(:p_cert_num) from dual'into v_typeusing p_cert_num;execute immediate'select (select substr((select :p_cert_num from dual),1,6) from dual )||19||(select substr((select :p_cert_num from dual),7,9) from dual) from dual'into v_cert_numusing p_cert_num,p_cert_num;--判断身份证是否为15位if v_type<>15then dbms_output.put_line('请输入证件号为15位的身份证信息');else--校验取余v_sum:=substr(v_cert_num,1,1)*7+substr(v_cert_num,2,1)*9+substr(v_cert_num,3,1)*10+substr(v_cert_num,4,1)*5+substr(v_cert_num,5,1)*8+substr(v_cert_num,6,1)*4+substr(v_cert_num,7,1)*2+substr(v_cert_num,8,1)*1+substr(v_cert_num,9,1)*6+substr(v_cert_num,10,1)*3+substr(v_cert_num,11,1)*7+substr(v_cert_num,12,1)*9+substr(v_cert_num,13,1)*10+substr(v_cert_num,14,1)*5+substr(v_cert_num,15,1)*8+substr(v_cert_num,16,1)*4+substr(v_cert_num,17,1)*2;--取出生年月v_nian:=substr(v_cert_num,7,4);v_yue:=substr(v_cert_num,11,2);v_ri:=substr(v_cert_num,13,2);--取性别v_sex:=substr(v_cert_num,17,1);--取地区v_sf:=substr(v_cert_num,1,6);v_sf_f:=substr(v_cert_num,1,2);--7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2v_yu:=mod(v_sum,11);--0 1 2 3 4 5 6 7 8 9 10,1 0 X 9 8 7 6 5 4 3 2 --得出新18位证件号if v_yu=0then v_new:=v_cert_num||'1';elsif v_yu=1then v_new:=v_cert_num||'0';elsif v_yu=2then v_new:=v_cert_num||'X';elsif v_yu=3then v_new:=v_cert_num||'9';elsif v_yu=4then v_new:=v_cert_num||'8';elsif v_yu=5then v_new:=v_cert_num||'7';elsif v_yu=6then v_new:=v_cert_num||'6';elsif v_yu=7then v_new:=v_cert_num||'5';elsif v_yu=8then v_new:=v_cert_num||'4';elsif v_yu=9then v_new:=v_cert_num||'3';elsif v_yu=10then v_new:=v_cert_num||'2';end if;--判断新产生的18位身份证号码真伪依据月份日期判断只能。
15位身份证号码转18位算法
15位⾝份证号码转18位算法18位⾝份证标准在国家质量技术监督局于1999年7⽉1⽇实施的GB11643-1999《公民⾝份号码》中做了明确的规定。
GB11643-1999《公民⾝份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民⾝份号码",另外GB11643-1999《公民⾝份号码》从实施之⽇起代替GB11643-1989。
GB11643-1999《公民⾝份号码》主要内容如下:⼀、范围该标准规定了公民⾝份号码的编码对象、号码的结构和表现形式,使每个编码对象获得⼀个唯⼀的、不变的法定号码。
⼆、编码对象公民⾝份号码的编码对象是具有中华⼈民共和国国籍的公民。
三、号码的结构和表⽰形式1、号码的结构公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位校验码组成。
排列顺序从左⾄右依次为:六位数字地址码,⼋位数字出⽣⽇期码,三位数字顺序码和⼀位数字校验码。
2、地址码表⽰编码对象常住户⼝所在县(市、旗、区)的⾏政区划代码,按GB/T2260的规定执⾏。
3、出⽣⽇期码表⽰编码对象出⽣的年、⽉、⽇,按GB/T7408的规定执⾏,年、⽉、⽇代码之间不⽤分隔符。
4、顺序码表⽰在同⼀地址码所标识的区域范围内,对同年、同⽉、同⽇出⽣的⼈编定的顺序号,顺序码的奇数分配给男性,偶数分配给⼥性。
5、校验码(1)⼗七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和Ai:表⽰第i位置上的⾝份证号码数字值Wi:表⽰第i位置上的加权因⼦Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(2)计算模Y = mod(S, 11)(3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 2四、举例如下:北京市朝阳区: 110105************⼴东省汕头市: 44052418800101001415位升18的⽅法根据〖中华⼈民共和国国家标准 GB 11643-1999〗中有关公民⾝份号码的规定,公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位数字校验码组成。
身份证号码批量15位转18位
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
18位身份证和组织机构代码校验ORACLE函数
18位身份证和组织机构代码校验ORACLE函数第一篇:18位身份证和组织机构代码校验ORACLE函数18位身份证和组织机构代码校验ORACLE函数18位身份证和组织机构代码校验ORACLE函数18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确规定。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。
其含义如下:1.地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2.出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。
3.顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
校验的计算方式:1.对前17位数字本体码加权求和公式为:S = Sum(Ai * Wi), i = 0,..., 16其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 22.以11对计算结果取模Y = mod(S, 11)3.根据模的值得到对应的校验码对应关系为:Y值: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 215位的身份证号dddddd yymmdd xx p18位的身份证号dddddd yyyymmdd xx p y其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同 yyyymmdd yymmdd 为出生年月日 xx顺号类编码 p性别18位中末尾的y为校验码,在网上可以找到算法(1)、前两个数字代表省份编码。