함수
1.“문자열”.substring(시작위치, 끝나는 위치+1);
[주민등록번호]
String rrn = ㄱㄴㄷㄹㅁㅂ-ㅅㅇㅈㅊㅋㅌ
1. 생년월일 – getBirthday(rrn)
public static String getBirthday(String rrn){
String year = rrn.substring(0,2);
String month = rrn.substring(2,4);
String day = rrn.substring(4,6);
String gender = rrn.substring(7,8);
switch(gender){
case "9": case "0":
year = 18 + year;
break;
case "1": case "2": case "5": case "6":
year = 19 + year;
break;
case "3": case "4": case "7": case "8":
year = 20 + year;
break;
}
return String.format("%s년%s월%s일", year, month, day);
}
2. 성별 (9,0 : 1800년대)(1,2 : 1900년대)(3,4 : 2000년대)(5,6 : 1900년대 외국인) (7,8 : 2000년대 외국인)
public static boolean getGender(String rrn){
String gender = rrn.substring(7,8);
String maleRegex = "[13479]";
return gender.matches(maleRegex);
}
3. 출생지역 (출생등록지 + 주민센터) + 순서
4. 나이
public static int getAge(String birthday,String choice){
Date d = new Date();
int thisYear = d.getYear()+1900;
int thisMonth = d.getMonth()+1;
int thisDay = d.getDate();
int birthYear = Integer.parseInt(birthday.substring(0,4));
int birthMonth = Integer.parseInt(birthday.substring(5,7));
int birthDay = Integer.parseInt(birthday.substring(8,10));
int age = 0;
if(choice == "한국") age = thisYear - birthYear +1;
else if(choice == "만") {
boolean isCheck = thisMonth*100 + thisDay >= birthMonth*100 + birthDay;
age = thisYear - birthYear –1;
age = isCheck ? ++age : age;
}
return age;
}
5. 외국인 / 내국인
public static boolean isCheckLocal(String rrn){
String checkNumber = rrn.substring(7,8);
String regex = "[0-9&&[^5-8]]";
return checkNumber.matches(regex);
}
6. 태어난 세기
7. 검증 체크
- ㅍ = 11-{(2*ㄱ+3*ㄴ+4*ㄷ+5*ㄹ+6*ㅁ+7*ㅂ+8*ㅅ+9*ㅇ+2*ㅈ+3*ㅊ+4*ㅋ+5*ㅌ) % 11}
- 즉, 소괄호 안에 있는 것을 계산한 값을 11로 나눠서 나온 나머지를 11에서 뺀 값이 ㅍ이다.
- (단, 10은 0, 11은 1로 표기한다.)
public static boolean checkRrn(String rrn){
int [] m = {2,3,4,5,6,7,0,8,9,2,3,4,5};
int ㅎ = Integer.parseInt(rrn.substring(13,14));
int ㅍ = 0;
for(int i = 0; i <=12; i++){
if(i == 6) continue;
ㅍ += Integer.parseInt(rrn.substring(i,i+1))*m[i];
}
return ㅎ == (11 - (ㅍ % 11) % 10);
}
만년달력
1. 년도와 월 입력받기.
2. 달력그리기
- 년, 월의 1일의 요일 ? 2010.5.1
- 1.1.1 ~ year.month.1 까지의 총 날짜수 %7 => ?요일(0:월, 1:화, 2:수, ... 6:금)
public static int getDateOfWeek(int year, int month){ int totalDay = 0; totalDay = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400; for(int i = 1; i < month; i++) totalDay += getLastDay(year,i); return (totalDay + 1) % 7; }
- 년,월 마지막 날짜 31일
- 28 : 평년 2월
- 29 : 윤년 2월
- 30 : 4,6,9,11 월
- 31 : 1,3,5,7,8,10,12 월
public static int getLastDay(int year, int month){ int [] m = {31,28,31,30,31,30,31,31,30,31,30,31}; if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ) m[1]++; return m[month-1]; }
클린코드
1.
| if( 오늘월 > month || 오늘월 == month && 오늘일 >= day) age +=1; |
| int b_monthday = Integer.parseInt(rrn.substring(2, 6)); // -> "0112" -> 112 int t_monthday = 오늘월*100 + 오늘일; if(t_monthday >= b_monthday) age++; |
2.
| String [] splitRrn = rrn.split(""); int [] intRrn = new int[splitRrn.length-1]; int sum = 0, lastNumber = 0; boolean isCheck = false; for (int i = 0; i < splitRrn.length -1; i++) intRrn[i] = Integer.parseInt(i < 6? splitRrn[i] : splitRrn[i+1]); for (int i = 1, k=0; i<= 2; i++) for (int j = 2; i == 1? j<= 9 : j<= 5; j++, k++) sum += intRrn[k]*j; lastNumber = (11 - (sum % 11)); if (lastNumber == 10) lastNumber = 0; else if (lastNumber == 11) lastNumber = 1; isCheck = lastNumber == intRrn[intRrn.length-1]; System.out.println((isCheck ? "올바른": "잘못된" ) + " 주민등록번호 입니다." ); |
| int ㅎ = Integer.parseInt(rrn.substring(13, 14)); int ㅍ = 0; int [] m = {2,3,4,5,6,7,0,8,9,2,3,4,5}; for (int i = 0; i <= 12 ; i++) if(i == 6) continue; ㅍ += Integer.parseInt(rrn.substring(i, i+1))*m[i]; ㅍ = (11-(ㅍ%11)) % 10; System.out.println((ㅍ==ㅎ ? "올바른" : "잘못된") + "주민등록번호 입니다."); |
3.
| switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: lastDay = 31; break; case 4: case 6: case 9: case 11: lastDay = 30; break; case 2: lastDay = Ex02_02.isleapCheck(year) ? 29 : 28 ; break; default : System.out.println("월 잘못입력"); break; } return lastDay; |
| int [] months = {31,28,31,30,31,30,31,31,30,31,30,31}; return Ex02_02.isleapCheck(year) && month == 2 ? ++months[month-1] : months[month-1]; |
4.
| int [] months = {31,28,31,30,31,30,31,31,30,31,30,31}; months[1] = Ex02_02.isleapCheck(year)? 29 : 28; int totalDays = 0; for (int k = 1; k < year; k++) totalDays += Ex02_02.isleapCheck(k)? 366 : 365; for (int k = 1; k < month; k++) totalDays += months[k-1]; return totalDays +i; |
| totalDays = (year - 1) * 365 + (year -1)/4 - (year-1)/100 + (year-1)/400; for (int k = 1; k < month; k++) totalDays += getLastDay(year,k); return totalDays + i; |