시소당
/**
* <pre>
* 주민등록번호가 올바른지 확인하여 결과를 반환한다. (주민번호 로직1)
*
* @param serial1 주민등록번호 앞6자리
* @param serial2 주민등록번호 뒤7자리
* @return boolean 맞으면 true, 아니면 false.
* </pre>
*/
public static boolean isResNo(String serial1, String serial2) {
if (serial1.length() != 6) {
return false;
} else if (serial2.length() != 7) {
return false;
} else {
int digit = 0;
for (int i = 0; i < serial1.length(); i++) {
String str_dig = serial1.substring(i, i + 1);
if (str_dig.length() < 0 || str_dig.length() > 9) {
digit = digit + 1;
}
}
if ((serial1 == "") || (digit != 0)) {
return false;
}
int digit1 = 0;
for (int i = 0; i < serial2.length(); i++) {
String str_dig1 = serial2.substring(i, i + 1);
if (str_dig1.length() < 0 || str_dig1.length() > 9) {
digit1 = digit1 + 1;
}
}
if ((serial2 == "") || (digit1 != 0)) {
return false;
}
if (Integer.parseInt(serial1.substring(2, 3)) > 1) {
return false;
}
if (Integer.parseInt(serial1.substring(4, 5)) > 3) {
return false;
}
if (Integer.parseInt(serial2.substring(0, 1)) > 4
|| Integer.parseInt(serial2.substring(0, 1)) == 0) {
return false;
}
int a1 = Integer.parseInt(serial1.substring(0, 1));
int a2 = Integer.parseInt(serial1.substring(1, 2));
int a3 = Integer.parseInt(serial1.substring(2, 3));
int a4 = Integer.parseInt(serial1.substring(3, 4));
int a5 = Integer.parseInt(serial1.substring(4, 5));
int a6 = Integer.parseInt(serial1.substring(5, 6));
int check_digit1 = a1 * 2 + a2 * 3 + a3 * 4 + a4 * 5 + a5 * 6 + a6
* 7;
int b1 = Integer.parseInt(serial2.substring(0, 1));
int b2 = Integer.parseInt(serial2.substring(1, 2));
int b3 = Integer.parseInt(serial2.substring(2, 3));
int b4 = Integer.parseInt(serial2.substring(3, 4));
int b5 = Integer.parseInt(serial2.substring(4, 5));
int b6 = Integer.parseInt(serial2.substring(5, 6));
int b7 = Integer.parseInt(serial2.substring(6, 7));
int check_digit = check_digit1 + b1 * 8 + b2 * 9 + b3 * 2 + b4 * 3
+ b5 * 4 + b6 * 5;
check_digit = check_digit % 11;
check_digit = 11 - check_digit;
check_digit = check_digit % 10;
if (check_digit != b7) {
return false;
} else {
return true;
}
}
}
/**
* <pre>
* 주민등록번호를 받아서 유효한 주민등록번호인지 확인 (주민번호 로직2)
*
* @param resNo String 형태의 주민등록번호
* @return boolean 유효한 주민등록번호인지 여부 true/false
* </pre>
*/
public static boolean isResNo(String resNo) {
int sum;
String checkNumber = "234567892345"; // 주민등록번호 검사용 값
String birthDate = "";
sum = 0;
try {
if (resNo != null) {
// 주민등록번호 자리수가 맞는가를 확인한다.
if (resNo.length() == 13) {
// 주민등록번호의 뒷 부분 첫 자리가 형식에 맞는지 확인한다.
if (Integer.parseInt(resNo.substring(6, 7)) < 1
|| Integer.parseInt(resNo.substring(6, 7)) > 4) {
return false;
} else {
switch (Integer.parseInt(resNo.substring(6, 7))) {
case 1:
birthDate = "19" + resNo.substring(0, 6);
break;
case 2:
birthDate = "19" + resNo.substring(0, 6);
break;
case 3:
birthDate = "20" + resNo.substring(0, 6);
break;
case 4:
birthDate = "20" + resNo.substring(0, 6);
break;
}
if (isValidDate(birthDate)) { // 주민등록번호 앞 자리가 유효한 날짜인가
// 점검
for (int i = 1; i < 13; i++) { // 주민등록번호 끝 자리 점검 식
sum = sum
+ Integer.parseInt(resNo.substring(
i - 1, i))
* Integer.parseInt(checkNumber
.substring(i - 1, i));
}
sum = 11 - (sum % 11);
if (Integer.parseInt(resNo.substring(12, 13)) == (sum % 10)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
} else {
return false;
}
} else {
return false;
}
} catch (Exception e) { // 숫자가 아닌 값이 넘어 왔을 경우에는 exception에서 false 처리가
// 된다.
return false;
}
}
/**
* <pre>
* 외국인을 위해 발급된 주민번호에 대한 Validation 체크를 한다.
* 외국인에게는 뒷자리가 5,6,7,8,9,0 으로 시작하는 주민번호가 발급된다.
*
* <외국인 주민번호 routine>
*
* 외국인이 우리나라에 90일 이상 체류할 목적으로 들어오는 경우
* 법무부산하 출입국관리사무소에 외국인등록을 하여야 한다.
* 이때 부여되는 등록번호를 외국인등록번호라 하는데,
* 우리나라 국민의 주민등록번호와는 자릿수는 같지만
* 생성체계가 약간 틀리다.
*
* 외국인등록번호 체계는 다음과 같다.
* 000000-1234567
*
* 앞의 6자리는 생년월일
*
* 뒷자리는
*
* 000000-1 23 45 6 7
*
* 1 : [성별구분]
* 23 : [등록기관번호]
* 45 : [일련번호]
* 6 : [등록자 구분]
* 7 : [검증번호]
*
* [성별구분]은
* 1900년대 출생자인 경우 남자는 5, 여자는 6,
* 2000년대 출생자인 경우 남자는 7, 여자는 8
*
* [등록기관번호]는 외국인등록기관(출입국관리사무소)의 고유번호
*
* [일련번호]는 등록당시 등록순서에 따라 순차적으로 부여
*
* [등록자 구분]은
* - 9 : 외국인(순수외국인)
* - 8 : 재외국민(이민을 간 우리나라사람중 국적이 한국인 사람)
* - 7 : 외국국적동포(이민가서 국적까지 취득한 사람)
*
* [검증번호]는 체계에 맞는지 확인하는 번호이다.
* 제일 마지막자리는 검증번호
*
* @param serial1 String 주민번호 앞 6자리
* @param serial2 String 주민번호 뒤 7자리
* @return boolean 유효한 주민번호인지 여부 true/false
* </pre>
*/
public static boolean isResNoForeign(String serial1, String serial2) {
String birthYear = "";
String fgnno = serial1 + serial2;
// 전체자릿수 체크
if ((serial1 + serial2).length() != 13) {
return false;
}
// 주민번호 앞 6자리 체크
if ((fgnno.charAt(6) == '5') || (fgnno.charAt(6) == '6')) {
birthYear = "19" + fgnno.substring(0, 6);
} else if ((fgnno.charAt(6) == '7') || (fgnno.charAt(6) == '8')) {
birthYear = "20" + fgnno.substring(0, 6);
} else if ((fgnno.charAt(6) == '9') || (fgnno.charAt(6) == '0')) {
birthYear = "18" + fgnno.substring(0, 6);
} else {
// new BizException("등록번호에 오류가 있습니다. 다시 확인하십시오.");
return false;
}
// 주민등록번호 앞 자리가 유효한 날짜인가 점검
if (isValidDate(birthYear) == false) {
return false;
}
// 주민번호 뒷자리 체크
int sum = 0;
int odd = 0;
int[] buf = new int[13];
for (int i = 0; i < 13; i++) {
buf[i] = Character.getNumericValue(fgnno.charAt(i));
}
odd = buf[7] * 10 + buf[8];
if (odd % 2 != 0) {
return false;
}
if ((buf[11] != 6) && (buf[11] != 7) && (buf[11] != 8)
&& (buf[11] != 9)) {
return false;
}
int[] multipliers = new int[] { 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 };
for (int i = 0; i < 12; i++) {
sum += (buf[i] *= multipliers[i]);
}
sum = 11 - (sum % 11);
if (sum >= 10)
sum -= 10;
sum += 2;
if (sum >= 10)
sum -= 10;
if (sum != buf[12]) {
return false;
}
return true;
}