반응형
import java.io.File;
import java.io.FileWriter;
public class ResidentRegistrationRandomNumber {
/**
* @param savePath - 파일 추출 경로
* @param count - 추출 개수
* @param startYear - 추출 시작년도
* @param endYear - 추출 종료년도
* @param type - old : 1900년 ~ 1999년 / new : 2000년 이후 -
*/
public void makeRandomRegistrationNumber(String savePath,
int count,int startYear, int endYear, String type){
try {
/** 파일 객체 생성 **/
File file = new File(savePath);
FileWriter fileWriter = new FileWriter(file, true);
/** 주민등록번호 랜덤 생성 **/
for (int i = 0; i < count; i++) {
String frontNumber = makeFrontNumber(startYear, endYear); // 주민 앞번호
String backNumber = makeBackNumber(frontNumber, type); // 주민 뒷번호
String result = frontNumber + "-" + backNumber; // 앞번호 - 뒷번호
fileWriter.write(result);
fileWriter.write("\r\n");
fileWriter.flush();
}
fileWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param frontNumber 주민번호 앞자리
* @param type old - 1900년 ~ 1999년 / new - 2000년 이후
* @return 주민번호 뒷자리 생성
*/
private String makeBackNumber(String frontNumber ,String type) {
int gender = 1;
if(type.equals("new")) gender = ((int) (Math.random() * 2 + 3));
else if(type.equals("old")) gender = ((int) (Math.random() * 2 + 1));
int birthCode = ((int) (Math.random() * 9599 + 1));
int birthRegisterOrderNum = ((int) (Math.random() * 3 + 1));
String birthCodeStr = "";
if (birthCode < 10) birthCodeStr = "000" + String.valueOf(birthCode);
else if (birthCode < 100) birthCodeStr = "00" + String.valueOf(birthCode);
else if (birthCode < 1000) birthCodeStr = "0" + String.valueOf(birthCode);
else birthCodeStr = String.valueOf(birthCode);
String backNumber = String.valueOf(gender) + birthCodeStr + String.valueOf(birthRegisterOrderNum);
int lastNumber = makeLastNum(frontNumber, backNumber);
backNumber += String.valueOf(lastNumber);
return backNumber;
}
/** 검증식 참고자료 **/
// https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=mumasa&logNo=222102707153
/**
* @param frontNumber - 주민 앞번호
* @param backNumber - 주민 뒷번호
* @return 주민앞번호 및 뒷번호을 이용한 검증식으로 주민등록번호 맨 마지막 숫자 생성
*/
private int makeLastNum(String frontNumber, String backNumber) {
int lastNumber;
int f0 = frontNumber.charAt(0) * 2;
int f1 = frontNumber.charAt(1) * 3;
int f2 = frontNumber.charAt(2) * 4;
int f3 = frontNumber.charAt(3) * 5;
int f4 = frontNumber.charAt(4) * 6;
int f5 = frontNumber.charAt(5) * 7;
int b0 = backNumber.charAt(0) * 8;
int b1 = backNumber.charAt(1) * 9;
int b2 = backNumber.charAt(2) * 2;
int b3 = backNumber.charAt(3) * 3;
int b4 = backNumber.charAt(4) * 4;
int b5 = backNumber.charAt(5) * 5;
int sum = f0 + f1 + f2 + f3 + f4 + f5 + b0 + b1 + b2 + b3 + b4 + b5;
int minus = sum % 11;
if (minus == 0 || minus == 1) lastNumber = 0; // 나머지가 0 또는 1인 경우 - 0으로 분기처리
else lastNumber = 11 - minus;
return lastNumber;
}
/**
* @param startYear 시작년도
* @param endYear 종료년도
* @return 주민등록번호 앞자리 (※ 윤년 고려 X)
*/
private String makeFrontNumber(int startYear, int endYear) {
/** ---- 년도 생성 ---- **/
int rangeYear = endYear - startYear;
int year = ((int) ((Math.random() * rangeYear) + startYear));
String yearStr = "";
if(year < 10) yearStr = "0" + String.valueOf(year);
else yearStr = String.valueOf(year);
/** ---- 월 생성 ---- **/
int month = ((int) (Math.random() * 12) + 1);
String monthStr = "";
if (month < 10) monthStr = "0" + String.valueOf(month);
else monthStr = String.valueOf(month);
/** ---- 일 생성 ---- **/
int day = 0;
switch (month) {
case 1:
day = ((int) (Math.random() * 30 + 1));
break;
case 2:
day = ((int) (Math.random() * 28 + 1));
break;
case 3:
day = ((int) (Math.random() * 30 + 1));
break;
case 4:
day = ((int) (Math.random() * 29 + 1));
break;
case 5:
day = ((int) (Math.random() * 30 + 1));
break;
case 6:
day = ((int) (Math.random() * 29 + 1));
break;
case 7:
day = ((int) (Math.random() * 30 + 1));
break;
case 8:
day = ((int) (Math.random() * 30 + 1));
break;
case 9:
day = ((int) (Math.random() * 29 + 1));
break;
case 10:
day = ((int) (Math.random() * 30 + 1));
break;
case 11:
day = ((int) (Math.random() * 29 + 1));
break;
case 12:
day = ((int) (Math.random() * 30 + 1));
break;
}
String dayStr = "";
if (day < 10) dayStr = "0" + String.valueOf(day);
else dayStr = String.valueOf(day);
String frontNumber = yearStr + monthStr + dayStr; // 주민번호 앞 자리
return frontNumber;
}
}
반응형
'[Java] > [Java Code]' 카테고리의 다른 글
[Java Code] [클린코드] Boolean OR절 축약 (0) | 2023.12.08 |
---|---|
[Java Code] 자바로 구현한 다양한 캡차 (모자이크, 숫자 더하기, 같은 색 맞추기, 가위바위보) (0) | 2023.05.31 |
[Java Code] 영문오타 한글로 교정시키는 코드 (띄어쓰기는 적용 안 됨) [영문오타교정] (0) | 2023.05.29 |
[Java Code] yyyymmdd 날짜 계산하기, HHmmss 시간 계산하기 (두 날짜 또는 시간 빠른 순서 찾기) (0) | 2022.12.01 |
[Java Code] ini 설정 파일 읽기 (0) | 2022.11.05 |