Commit f55f4ae6 authored by yanzg's avatar yanzg

身份证识别

parent 0d046be0
...@@ -60,20 +60,8 @@ public class SfzHandle15 implements SfzHandle { ...@@ -60,20 +60,8 @@ public class SfzHandle15 implements SfzHandle {
return null; return null;
} }
if (SfzHandleUtil.isNum(idCard)) { if (SfzHandleUtil.isNum(idCard)) {
// 获取出生年月日
String birthday = idCard.substring(6, 12); String birthday = idCard.substring(6, 12);
Date birthDate = null; String sYear = getBirthDateYear(birthday);
try {
birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
if (birthDate != null) {
cal.setTime(birthDate);
}
// 获取出生年(完全表现形式,如:2010)
String sYear = String.valueOf(cal.get(Calendar.YEAR));
idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8); idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8);
// 转换字符数组 // 转换字符数组
char[] cArr = idCard18.toCharArray(); char[] cArr = idCard18.toCharArray();
...@@ -94,6 +82,28 @@ public class SfzHandle15 implements SfzHandle { ...@@ -94,6 +82,28 @@ public class SfzHandle15 implements SfzHandle {
return idCard18; return idCard18;
} }
/**
* 获取生日年份
*
* @param birthday 生日
* @return 年份
*/
public static String getBirthDateYear(String birthday) {
// 获取出生年月日
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);
}
// 获取出生年(完全表现形式,如:2010)
return String.valueOf(cal.get(Calendar.YEAR));
}
@Override @Override
public String getGender(String idCard) { public String getGender(String idCard) {
return SfzHandleUtil.SFZ_HANDLE_18.getGender(this.repair(idCard)); return SfzHandleUtil.SFZ_HANDLE_18.getGender(this.repair(idCard));
......
...@@ -43,19 +43,23 @@ public class SfzHandle18 implements SfzHandle { ...@@ -43,19 +43,23 @@ public class SfzHandle18 implements SfzHandle {
String code17 = idCard.substring(0, endIndex); String code17 = idCard.substring(0, endIndex);
// 第18位 // 第18位
String code18 = idCard.substring(endIndex); String code18 = idCard.substring(endIndex);
if (SfzHandleUtil.isNum(code17)) { char[] cArr = code17.toCharArray();
char[] cArr = code17.toCharArray(); if (cArr != null) {
if (cArr != null) { int[] iCard = converCharToInt(cArr);
int[] iCard = converCharToInt(cArr); int iSum17 = getPowerSum(iCard);
int iSum17 = getPowerSum(iCard); // 获取校验位
// 获取校验位 String val = getCheckCode18(iSum17);
String val = getCheckCode18(iSum17); if (val.length() > 0 && val.equalsIgnoreCase(code18)) {
if (val.length() > 0 && val.equalsIgnoreCase(code18)) { bTrue = true;
bTrue = true;
}
} }
} }
return bTrue; if (SfzHandleUtil.isNum(code17) && idCard.length() == CHINA_ID_MAX_LENGTH) {
return bTrue;
} else if (idCard.length() != CHINA_ID_MIN_LENGTH) {
return bTrue;
} else {
return false;
}
} }
@Override @Override
...@@ -92,14 +96,7 @@ public class SfzHandle18 implements SfzHandle { ...@@ -92,14 +96,7 @@ public class SfzHandle18 implements SfzHandle {
@Override @Override
public String getProvinceName(String idCard) { public String getProvinceName(String idCard) {
int len = idCard.length(); return cityCodes.get(this.getAreaId(idCard).substring(0, 2));
String sProvince = null;
String sProvinNum = "";
if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
sProvinNum = idCard.substring(0, 2);
}
sProvince = cityCodes.get(sProvinNum);
return sProvince;
} }
/** /**
......
package com.yanzuoguang.util.sfz; package com.yanzuoguang.util.sfz;
import com.yanzuoguang.util.helper.StringHelper;
import java.util.regex.Pattern;
import static com.yanzuoguang.util.sfz.SfzHandle15.CHINA_ID_MIN_LENGTH;
import static com.yanzuoguang.util.sfz.SfzHandle15.getBirthDateYear;
import static com.yanzuoguang.util.sfz.SfzHandleUtil.cityCodes;
/** /**
* 2017年国外永居证处理 * 2017年国外永居证处理
* *
* @author 颜佐光 * @author 颜佐光
*/ */
public class SfzHandleEn2017 implements SfzHandle { public class SfzHandleEn2017 implements SfzHandle {
public static final Pattern EN2017 = Pattern.compile("^[a-zA-Z]{3}\\d{12}$");
@Override @Override
public boolean validate(String idCard) { public boolean validate(String idCard) {
if (idCard.length() == CHINA_ID_MIN_LENGTH && EN2017.matcher(idCard).matches()) {
return true;
}
return false; return false;
} }
@Override @Override
public String repair(String idCard) { public String repair(String idCard) {
return null; return idCard;
} }
@Override @Override
public String getGender(String idCard) { public String getGender(String idCard) {
return null; return StringHelper.EMPTY;
} }
@Override @Override
public String getBirthday(String idCard) { public String getBirthday(String idCard) {
return null; String birthday = idCard.substring(7, 13);
return getBirthDateYear(birthday) + birthday.substring(2,6);
} }
@Override @Override
public String getCountry(String idCard) { public String getCountry(String idCard) {
return null; return StringHelper.EMPTY;
} }
@Override @Override
public String getAreaId(String idCard) { public String getAreaId(String idCard) {
return null; return idCard.substring(3, 5);
} }
@Override @Override
public String getProvinceName(String idCard) { public String getProvinceName(String idCard) {
return null; return cityCodes.get(this.getAreaId(idCard).substring(0, 2));
} }
} }
package com.yanzuoguang.util.sfz; package com.yanzuoguang.util.sfz;
import static com.yanzuoguang.util.sfz.SfzHandle15.CHINA_ID_MIN_LENGTH;
import static com.yanzuoguang.util.sfz.SfzHandle18.CHINA_ID_MAX_LENGTH; import static com.yanzuoguang.util.sfz.SfzHandle18.CHINA_ID_MAX_LENGTH;
import static com.yanzuoguang.util.sfz.SfzHandleUtil.cityCodes; import static com.yanzuoguang.util.sfz.SfzHandleUtil.cityCodes;
...@@ -32,7 +31,7 @@ public class SfzHandleEn2023 implements SfzHandle { ...@@ -32,7 +31,7 @@ public class SfzHandleEn2023 implements SfzHandle {
@Override @Override
public String getBirthday(String idCard) { public String getBirthday(String idCard) {
return SfzHandleUtil.SFZ_HANDLE_18.getGender(idCard); return SfzHandleUtil.SFZ_HANDLE_18.getBirthday(idCard);
} }
@Override @Override
...@@ -47,13 +46,6 @@ public class SfzHandleEn2023 implements SfzHandle { ...@@ -47,13 +46,6 @@ public class SfzHandleEn2023 implements SfzHandle {
@Override @Override
public String getProvinceName(String idCard) { public String getProvinceName(String idCard) {
int len = idCard.length(); return cityCodes.get(this.getAreaId(idCard).substring(0, 2));
String sProvince = null;
String sProvinNum = "";
if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
sProvinNum = idCard.substring(1, 3);
}
sProvince = cityCodes.get(sProvinNum);
return sProvince;
} }
} }
...@@ -11,11 +11,11 @@ import java.util.regex.Pattern; ...@@ -11,11 +11,11 @@ import java.util.regex.Pattern;
*/ */
public class SfzHandleHuZhao implements SfzHandle { public class SfzHandleHuZhao implements SfzHandle {
private static final String HU_ZHAO_REGEX = "^[a-zA-Z]{0,4}\\d{7,8}$"; private static final Pattern HU_ZHAO_REGEX = Pattern.compile("^[a-zA-Z]{0,4}\\d{7,8}$");
@Override @Override
public boolean validate(String idCard) { public boolean validate(String idCard) {
return Pattern.matches(HU_ZHAO_REGEX, idCard); return HU_ZHAO_REGEX.matcher(idCard).matches();
} }
@Override @Override
......
...@@ -5,14 +5,15 @@ import com.yanzuoguang.util.YzgError; ...@@ -5,14 +5,15 @@ import com.yanzuoguang.util.YzgError;
import com.yanzuoguang.util.helper.FileHelper; import com.yanzuoguang.util.helper.FileHelper;
import com.yanzuoguang.util.helper.JsonHelper; import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.util.helper.SfzhUtil; import com.yanzuoguang.util.helper.SfzhUtil;
import com.yanzuoguang.util.sfz.SfzHandleUtil;
import helper.vo.ResponseDataMainResult; import helper.vo.ResponseDataMainResult;
import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import static com.yanzuoguang.util.sfz.SfzHandleUtil.SFZ_HANDLE_15; import static com.yanzuoguang.util.sfz.SfzHandleUtil.SFZ_HANDLE_15;
import static com.yanzuoguang.util.sfz.SfzHandleUtil.SFZ_HANDLE_18;
public class TestSfzUtil { public class TestSfzUtil {
...@@ -55,6 +56,7 @@ public class TestSfzUtil { ...@@ -55,6 +56,7 @@ public class TestSfzUtil {
validateIdCard18("44142419920313185X"); validateIdCard18("44142419920313185X");
} }
@Test @Test
public void testId18() throws NoSuchMethodException { public void testId18() throws NoSuchMethodException {
// 获取泛型的返回值类型 // 获取泛型的返回值类型
...@@ -68,6 +70,7 @@ public class TestSfzUtil { ...@@ -68,6 +70,7 @@ public class TestSfzUtil {
} }
} }
} }
@Test @Test
public void testId18AND15() throws NoSuchMethodException { public void testId18AND15() throws NoSuchMethodException {
// 获取泛型的返回值类型 // 获取泛型的返回值类型
...@@ -82,6 +85,7 @@ public class TestSfzUtil { ...@@ -82,6 +85,7 @@ public class TestSfzUtil {
} }
} }
} }
@Test @Test
public void testId18AND15GetAge() throws NoSuchMethodException { public void testId18AND15GetAge() throws NoSuchMethodException {
// 获取泛型的返回值类型 // 获取泛型的返回值类型
...@@ -96,6 +100,62 @@ public class TestSfzUtil { ...@@ -96,6 +100,62 @@ public class TestSfzUtil {
} }
} }
@Test
public void testEn2017() throws NoSuchMethodException {
String idCard = "PAK310080010103";
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_15.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_18.validate(idCard));
Assert.assertTrue(SfzHandleUtil.SFZ_HANDLE_EN2017.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_EN2023.validate(idCard));
Assert.assertEquals("", SfzHandleUtil.SFZ_HANDLE_EN2017.getGender(idCard));
Assert.assertEquals("19800101", SfzHandleUtil.SFZ_HANDLE_EN2017.getBirthday(idCard));
Assert.assertEquals("", SfzHandleUtil.SFZ_HANDLE_EN2017.getCountry(idCard));
Assert.assertEquals("31", SfzHandleUtil.SFZ_HANDLE_EN2017.getAreaId(idCard));
Assert.assertEquals("上海", SfzHandleUtil.SFZ_HANDLE_EN2017.getProvinceName(idCard));
}
@Test
public void testEn2023() throws NoSuchMethodException {
String idCard = "931586198001010028";
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_15.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_18.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_EN2017.validate(idCard));
Assert.assertTrue(SfzHandleUtil.SFZ_HANDLE_EN2023.validate(idCard));
Assert.assertEquals("女", SfzHandleUtil.SFZ_HANDLE_EN2023.getGender(idCard));
Assert.assertEquals("19800101", SfzHandleUtil.SFZ_HANDLE_EN2023.getBirthday(idCard));
Assert.assertEquals("586", SfzHandleUtil.SFZ_HANDLE_EN2023.getCountry(idCard));
Assert.assertEquals("31", SfzHandleUtil.SFZ_HANDLE_EN2023.getAreaId(idCard));
Assert.assertEquals("上海", SfzHandleUtil.SFZ_HANDLE_EN2023.getProvinceName(idCard));
}
@Test
public void test18() throws NoSuchMethodException {
String idCard = "43052419871104817X";
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_15.validate(idCard));
Assert.assertTrue(SfzHandleUtil.SFZ_HANDLE_18.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_EN2017.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_EN2023.validate(idCard));
Assert.assertEquals("男", SfzHandleUtil.SFZ_HANDLE_18.getGender(idCard));
Assert.assertEquals("19871104", SfzHandleUtil.SFZ_HANDLE_18.getBirthday(idCard));
Assert.assertEquals("100", SfzHandleUtil.SFZ_HANDLE_18.getCountry(idCard));
Assert.assertEquals("430524", SfzHandleUtil.SFZ_HANDLE_18.getAreaId(idCard));
Assert.assertEquals("湖南", SfzHandleUtil.SFZ_HANDLE_18.getProvinceName(idCard));
}
@Test
public void test15() throws NoSuchMethodException {
String idCard = "430524871104817";
Assert.assertTrue(SfzHandleUtil.SFZ_HANDLE_15.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_18.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_EN2017.validate(idCard));
Assert.assertFalse(SfzHandleUtil.SFZ_HANDLE_EN2023.validate(idCard));
Assert.assertEquals("男", SfzHandleUtil.SFZ_HANDLE_15.getGender(idCard));
Assert.assertEquals("19871104", SfzHandleUtil.SFZ_HANDLE_15.getBirthday(idCard));
Assert.assertEquals("100", SfzHandleUtil.SFZ_HANDLE_15.getCountry(idCard));
Assert.assertEquals("430524", SfzHandleUtil.SFZ_HANDLE_15.getAreaId(idCard));
Assert.assertEquals("湖南", SfzHandleUtil.SFZ_HANDLE_15.getProvinceName(idCard));
}
/** /**
* 验证18位身份编码是否合法 * 验证18位身份编码是否合法
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment