안녕하세요. 제임스 입니다. 

 

자바에서 숫자에 콤마를 찍어 금액을 표기 하는 방법에 대해 알아 보겠습니다. 

 

 

■ DecimalFormat 을 이용하여 숫자에 콤마 찍기

 

 

DecimalFormat 은 NumberFormat 을 상속받고 있습니다. 

 

DecimalFormat(String pattern) 컨스트럭터를 이용하여 표현하고자 하는 패턴을 입력합니다. 

 

패턴 관련 정보는 아래 링크 참조 하시면 됩니다. 

https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html#numberpattern

 

 

1
DecimalFormat formatter = new DecimalFormat("###,###");
cs

 

위와 같이 패턴을 ###,### 와 같은 형식으로 입력 했습니다. 

이는 앞에 세자리 숫자 + " , " + 세자리 숫자 형태의 패턴을 의미 합니다. 

 

즉, 6자리가 넘어 가더라도 뒤 세자리 숫자 앞에 콤마 ( , ) 를 붙여 주게 되므로 백만 이상값을 표기 하는데 아무런 문제가 없습니다. 

 

사용 방법은 아래와 같습니다. 

 

1
formatter.format(12345);
cs

 

DecimalFormat 클래스의 format(long number) 함수를 이용하여 원하는 패턴의 결과 값을 가져올 수 있습니다. 

 

 

예제를 보시겠습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
DecimalFormat formatter = new DecimalFormat("###,###");
        
int price1 = 123;
int price2 = 1234;
int price3 = 123456;
int price4 = 1234567;
        
System.out.println("price1 금액 표기 결과 ["+price1+"] ==> "+formatter.format(price1));
System.out.println("price2 금액 표기 결과 ["+price2+"] ==> "+formatter.format(price2));
System.out.println("price3 금액 표기 결과 ["+price3+"] ==> "+formatter.format(price3));
System.out.println("price4 금액 표기 결과 ["+price4+"] ==> "+formatter.format(price4));
cs

 

실행 결과는 아래와 같습니다. 

 

Results

price1 금액 표기 결과 [123] ==> 123

price2 금액 표기 결과 [1234] ==> 1,234

price3 금액 표기 결과 [123456] ==> 123,456

price4 금액 표기 결과 [1234567] ==> 1,234,567

 

 

▶ 숫자에 콤마 표기 및 소수점 표기 하기

 

소숫점 까지 표기 하는 방법은 의외로 쉽습니다. 

 

1
DecimalFormat formatter = new DecimalFormat("###,###.##");
cs

 

패턴을 ###,###.## 

위와 같이 기존패턴에 .## 을 추가 하여 소수점 두자리 까지 표현 하는 것으로 정의 했습니다. 

이때 소수점 두번째 자리 아래는 반올림처리 됩니다. 

 

1
2
3
4
5
6
7
8
9
DecimalFormat formatter = new DecimalFormat("###,###.##");
        
int price1 = 1234567;
double price2 = 1234567.123;
double price3 = 1234567.127;
        
System.out.println("price1 금액 표기 결과 ["+price1+"] ==> "+formatter.format(price1));
System.out.println("price2 금액 표기 결과 ["+price2+"] ==> "+formatter.format(price2));
System.out.println("price3 금액 표기 결과 ["+price3+"] ==> "+formatter.format(price3));
cs

 

실행 결과는 아래와 같습니다. 

 

Results

price1 금액 표기 결과 [1234567] ==> 1,234,567

price2 금액 표기 결과 [1234567.123] ==> 1,234,567.12

price3 금액 표기 결과 [1234567.127] ==> 1,234,567.13

 

price2 와 price3 의 소수점 세번째 자리값을 비교 해보시면 반올림 처리 됨을 알 수 있습니다. 

 

 

 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D

 

 

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

 

 

 ■ Java 배열 정렬 (내림차순 vs 올림차순)

 

 

Arrays.sort() 함수를 이용하여 올림차순 및 내림차순 정렬을 할 수 있습니다. 

 

 

Syntax

 

public static void sort ( primitive_type_array a )

- 인자 값으로 primitive data type 인 byte[], char[], double[], long[], int[], float[] 등을 이용 합니다.

 

public static void sort ( primitive_type_array a, int fromIndex, int toIndex )

- 인자 값으로 primitive data type 인 byte[], char[], double[], long[], int[], float[] 등을 이용 하며, 정렬 시작 index 값 및 종료 index 값을 지정 합니다. 

 

public static void sort ( Object[] a )

- 인자 값으로 Object (객체) 를 받습니다. Integer[], Double[], Character[] 등의 값을 받을 수 있습니다. 

 

public static void sort ( Object[] a, int fromIndex, int toIndex )

- 인자 값으로 Object (객체) 를 받습니다. Integer[], Double[], Character[] 등의 값을 받을 수 있으며, 정렬 시작 index 값 및 종료 index 값을 지정 할 수 있습니다. 

 

public static <T> void sort ( T[] a, Comparator<? super T> c )

- 인자 값으로 객체를 받으며, 지정된 Comparator 가 가리키는 순서에 따라 지정된 객체의 배열을 정렬합니다.

 

public static <T> void sort ( T[] a, int fromIndex, int toIndex, Comparator<? super T> c )

- 인자 값으로 객체를 받으며, 지정된 Comparator 가 가리키는 순서에 따라 지정된 객체의 배열을 정렬하며, 정렬 시작 index 값 및 종료 index 값을 지정 합니다.

 

 

 

Example

 
▶ 올림차순

1
2
3
4
5
int[] arr = {214193116};
Arrays.sort(arr);
for(int i = 0; i < arr.length; i++){
    System.out.println(arr[i]);
}
cs

 

primitive data type 배열을 Arrays.sort() 함수에 입력하면 배열의 값이 변경 됩니다. 

올림 차순으로 소트를 했으므로 아래와 같이 배열이 변경 됩니다. 

 

arr =

 

위 코드를 실행 시키면 아래와 같은 결과 값이 나옵니다. 

 

4

16

19

21

31

 

 

1
2
3
4
5
int[] arr1 = {214193116};
Arrays.sort(arr1, 1, arr1.length);
for(int i = 0; i < arr1.length; i++){
    System.out.println(arr1[i]);
}
cs

 

첫번째 예제와 동일한 값을 가진 배열을 준비했습니다. 

sort() 함수의 인자 값이 세개로 첫번째는 배열을 두번째와 세번째는 변경할 index 범위를 지정합니다. 

 

위 예제에서는 변경할 index 값을 1 ~ 배열의 길이 만큼 지정 했습니다. (1 ~ 5) 

즉, 첫번째 21 값을 건드리지 않고 index 값이 1인 두번째 값 부터 마지막 값 까지만 정렬을 시킵니다.

변경 시 아래와 같은 순서로 배열이 정렬 됩니다. 

 

arr =

 

위 코드를 실행 하면 아래와 같은 결과를 얻을 수 있습니다. 

 

21

4

16

19

31

 

 

▶ 내림차순

 

1
2
3
4
5
Integer[] arr2 = {42153};
Arrays.sort(arr2, Collections.reverseOrder());
for(int i = 0; i < arr2.length; i++){
    System.out.println(arr2[i]);
}
cs

 

앞선 두개의 예제와 다르게 primitive data type 이 아니라 객체의 배열을 이용했습니다. 

Comparator 로는 Collections class 의 reverseOrder() 함수를 이용 했습니다. 

지금까지와 반대 오더 즉, 반대로 소트 하겠다는 의미로 내림차순 적용을 합니다. 

 

arr2 =

 

위와 같이 배열 정렬이 됩니다.

코드를 실행 하면 아래와 같습니다.

 

5

4

3

2

1

 

 

배열의 올림차순 및 내림차순 정렬에 대해 알아 봤습니다. 

 

 

 

 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



 

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

 

 

안녕하세요. 제임스 입니다.

 

이번에는 개발 중 종종 발생하는 오류중 하나인 NumbreFormatException 에 대해 정리 해보겠습니다. 

 

NumbreFormatException 은 왜 발생 하는 것일 까요? 

단어를 잘 보시면 이유를 알 수 있습니다. 

 

Number 와 관련된 오류 인데... 

Format Exception 이라고 합니다. 즉, 형식 오류라는 의미 인데요. 

풀어서 이야기 하면 숫자 형식 오류 라는 의미가 됩니다. 

 

 

그렇다면 어떤 경우에 발생하는지 예제를 보면서 다시 살펴 보겠습니다.

 

앞서 문자열을 숫자로 변환하는 방법에 대해 정리 했었는데요. (아래 링크 참조)

2018/03/06 - [Java] - [ 자바 코딩 ] Java Integer.parseInt

 

이와 관련하여 잘못된 사용으로 인해 오류가 발생 할 수 있습니다. 

1
2
3
4
5
6
7
8
package com.james.test;
public class JavaNumbers {
    public static void main(String[] args) {
        String str = "O1O";
        System.out.println(Integer.parseInt(str));
    }
}
 
cs

 

위 코드를 보시면 String str = "010"; 이라고 입력 되어 있습니다. 

사실 이 코드는 숫자 010 이 아닌 영문 대문자 O 와 숫자1 의 조합으로 영문 소문자로 사용 시 아래와 같이 표현 할 수 있습니다. 

String str = "o1o";

즉, 숫자 형이 아닌 말 그래로 문자열입니다. 

 

문자열을 숫자형으로 변환한다???

절대 불가능한 일이죠. 

이 경우 위 코드를 실행 시키명 아래와 같은 오류를 볼 수 있습니다. 

 

Exception in thread "main" java.lang.NumberFormatException: For input string: "O1O"

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at com.james.test.JavaNumbers.main(JavaNumbers.java:5)

 
 

이런 오류가 발생 하면 안되 겠지만 발생하는 경우가 있기 때문에 Exception 처리를 해주는 것이 중요 합니다. 

 

그래서 Integer.parseInt() 를 사용할 경우 try ~ catch ~ 를 이용하여 감싸줍니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.james.test;
public class JavaNumbers {
    public static void main(String[] args) {
        try {
            String str = "010";
            System.out.println(Integer.parseInt(str));
        } catch (NumberFormatException e) {
            // NumberFormatException 이 발생한 경우 처리 방법
        } catch (Exception e) {
            // Exception 이 발생한 경우 처리 방법
        }
    }
}
 
cs

 

각각의 Exception 종류에 따라 원하는 코드를 작성하여 처리 하여 주면 됩니다. 

만약 위와 같이 아무런 오류 처리를 하지 않을 경우 오류가 발생하더라도 아무런 반응을 하지 않게 됩니다.

 

위 코드에서는 정상적으로 숫자 010 을 입력 하였습니다. 

문제가 되던 오입력된 숫자형 무자열을 수정 하였으니 제대로 나오겠죠? ^^

 

실행 결과 값은 아래와 같습니다. 

 

10 

 

 

 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

 

 

안녕하세요. 제임스 입니다. 

 

이번에는 Java 에서 String 을 다룰때 유용하게 사용할 수 있는 함수 중 한가지인 split 함수에 대해 알아 보겠습니다. 

 

■ String[] split(String regex)

 

split 함수는 입력받은 정규표현식 또는 특정 문자를 기준으로 문자열을 나누어 배열(Array) 에 저장하여 리턴합니다. 

 

String str = "010-1234-5678";
String[] mobNum = str.split("-");
String ret1 = mobNum[0];
String ret2 = mobNum[1];
String ret3 = mobNum[2];

System.out.println("ret1 = "+ret1);
System.out.println("ret2 = "+ret2);
System.out.println("ret3 = "+ret3);

위와 같은 휴대폰 번호가 있다고 가정하고 이를 split("-") 했을 경우 

"010", "1234", "5678" 로 나누어져 배열에 저장됩니다. 

 

ret1 = 010

ret2 = 1234

ret3 = 5678

 

System.out.println("휴대폰번호 => "+ret1+"-"+ret2+"-"+ret3);

위와 같이 다시 휴대폰 번호 형태로 중간에 "-" 를 추가 해서 조합하면 결과는 아래와 같이 나옵니다. 

 

휴대폰번호 => 010-1234-5678

 

 

다른 예제 하나 더 보겠습니다. 

String str2 = "서울,대전,대구,부산,인천,울산";
String[] cityArr = str2.split(",");

for (int i = 0; i < cityArr.length; i++){
    System.out.println(cityArr[i]);
}

6개 도시명을 쉼표로 구분하여 나열했는데요, 이를 split(",") 했습니다. 

그리고 cityArr 의 length 만큼 for loop 을 돌려 결과 값을 찍어 봤습니다. 

 

서울

대전

대구

부산

인천

울산

 

결과 값이 이렇게 나옵니다. 참 쉽죠? 

 

정규표현식을 이용한 split 방법도 있는데요. 이는 정규표현식에 대한 내용을 포스팅한 이후 다시 한번 정리 하겠습니다. 

 

 

■ String[] split(String regex, int limit)

 

위의 인자값 하나만 받는것과 달리 int 형의 두번째 인자 값을 받는 split 함수 입니다. 

두번째 인자 값은 배열의 크기를 결정합니다. 

예제를 보면서 설명 드리겠습니다. 

 

String str2 = "81-2-010-1234-5678";
String[] arr = str2.split("-", 2);
System.out.println("ret4 = "+arr[0]);
System.out.println("ret5 = "+arr[1]);

위와 같은 String 값이 있다고 했을때 "-" 를 인자 값으로 split 하면서 배열의 크기는 2로 한정 했습니다. 

첫번째 "-" 를 기준으로 split 하면 아래와 같은 결과 값이 나옵니다. 

 

ret4 = 81

ret5 = 2-010-1234-5678

 

arr[] 배열에 이미 ret4 와 ret5 가 들어 있으므로 더이상의 배열을 생성하지 않고 위 값이 최종 결과 값이 됩니다. 

 

 

다른 예를 하나 더 보겠습니다. 

String str2 = "81-2-010-1234-5678";
String[] arr2 = str2.split("-", 4);
System.out.println(arr2.length);
for (int i = 0; i < arr2.length; i++){
    System.out.println("ret"+i+" = "+arr2[i]);
}

동일한 String 값을 두번째 인자값으로 4를 입력 합니다. 

arr2 배열 크기를 4로 지정한겁니다. 

 

어떤 결과 값이 나올지는 예상이 되시죠? ^^

 

ret0 = 81

ret1 = 2

ret2 = 010

ret3 = 1234-5678

 

위와 같이 arr2 배열에는 4개의 값이 들어 가게 됩니다. 

 

 

이상 자바 문자열을 자르기 해봤습니다. 

 

 

 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

 

 

안녕하세요. 제임스 입니다. 

 

Java 사용중 문자열을 원하는 위치에서 잘라야 하는 경우가 있습니다. 

이때 사용하는 하는 java 함수가 바로 substring 입니다. 

이번에는 이 substring 에 대해 자세히 알아 보겠습니다. 

 

 

■ String substring(int index)

 

substring 함수는 두가지가 있으며, 그중 첫번째로 인자값을 하나만 받는 함수 입니다. 

인자값은 int 형으로 substring 하고자 하는 문자열의 앞에서 부터 몇번째 위치인가를 지정하는 값입니다. 

입력받은 인자값을  index 로 해당 위치를 포함하여 이후의 모든 문자열을 리턴 시키는 함수 입니다. 

 

이때 이 index 값은 0 부터 시작 합니다. (첫번째 자리에 있다고 1 부터 시작한다고 생가하면 안됩니다.)

 

String str = "0123456789";

위와 같은 문자열이 있을때 0 ~ 4 까지를 제외한 56789 를 가져오고 싶을 경우 아래와 같이 호출 하면 됩니다. 

str.substring(5)

index 값이 5인 위치 이후 값을 가져 오라고 했으므로 56789 를 리턴하게 됩니다. 

 

 

String str2 = "자바코딩배우기";
System.out.println(str2.substring(4));

위와 같은 문자열을 substring(4) 를 하면 index 가 4 인 위치의 문자를 포함한 문자열을 리턴합니다. 

 

 문자열
index 값  0 1 2 3 4 5

 

위 표를 보시면 "배우기" 를 가져오기 위해서는 index 값을 4 로 입력하면 된다는 것을 알 수 있습니다. 

처음에 언급 했지만 index 는 0 부터 시작합니다 :)

 

 

String str3 = "자바코딩 배워볼까?";
System.out.println(str3.substring(5));

이번 문자열에는 띄어쓰기를 한 것이 보입니다. 물론 이 공백문자도 하나의 문자이므로 한자리를 차지 합니다. 

 

문자열   ? 
index 값 0 1 2 3 4 5 6 7 8 9

 

"배워볼까?" 라는 값을 리턴받기 위해 index 값을 5로 입력했다는 것을 알 수 있습니다. 

 

 

지금까지는 입력 인자값이 한개인 substring 함수를 알아봤습니다. 

이제 입력 인자값이 두개인 substring 에 대해 알아 보겠습니다. 

 

 

■ String substring(int beginIndex, int endIndex)

 

이번에 알아볼 substring 함수는 입력 인자값이 두개 입니다. 

 

첫번째 입력 받는 인자 값은 인자값이 한개인 substring 과 같이 가져올 문자열의 시작 부분을 지정합니다. 

두번째 입력 받는 인자 값은 가져올 문자열의 끝 부분을 지정 하는 것으로 substring(in index) 가 시작부분만 지정하고 나머지 모든 문자열을 리턴하는것과 차이가 있습니다. 

 

beginIndex 위치에서 시작하여 endIndex 전 위치까지의 값을 리턴 합니다. 

 

 

다음 문자열중 356512 값만 가져오는 것을 연습해 보겠습니다. 

String str = "0000003565120";
System.out.println(str.substring(6, 12));

 

 

문자열 0 0 0 0 0 0 3 5 6 5 1 2 0
 index 값 0 1 2 3 4 5 6 7 8 9 10 11 12

 

시작 인덱스 값을 6 으로 끝나는 인덱스 값을 12로 설정하여 원하는 356512 라는 값을 리턴 받을 수 있습니다. 

substring(6, 12) ==> index 6 위치에서 index 12 - 1 위치 (11 자리) 까지의 값을 리턴 합니다.

 

String str = "0000003565120";
System.out.println(str.substring(6, 13));
System.out.println(str.substring(6));

만약 위와 같이 substring(6, 13) 을 했다면?

그리고 substring(6) 을 했다면? 

결과 값은 어떻게 나올까요? 

 

예상 하시는 데로 3565120 이라는 동일한 리턴 값을 받게 됩니다. 

 

System.out.println(str.substring(6, 14));

만약 위와 같이 endIndex 값을 14로 주게 되면 어떻게 될까요? 

index 범위를 벗어나는 값을 입력 했으므로 아래와 같이 오류가 발생하게 됩니다. 

 

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 14

 

 

 

substring(int index) 보다는 substring(int beginIndex, int endIndex) 를 많이 사용 하게 되실겁니다. 

알아 두면 정말 유용하고, 꼭 알아 두어야 하는 java 함수 입니다. 

 

 

 

 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식을 이용한 split 함수를 이용 하는 방법에 대해 알아 보겠습니다. 



Java split 함수 관련 내용은 아래 포스팅을 참조 하세요.

2017/11/16 - [Java] - [ 자바 코딩 ] Java split() 함수로 문자열 자르기



■ 정규표현식으로 문자열 자르기 (split 함수 사용)



▶ 예제 1


1
String regExp = "\\Q|\\E";
cs


정규표현식을 위와 같이 작성하여 문자열 자르기를 위한 토큰 값으로 선언 했습니다. 


정규표현식에서 \Q 와 \E 는 한셋트로 사용되는 표현식으로 \Q 와 \E 사이의 문자를 의미 합니다. 

즉, 위 표현식의 경우 일반적으로 or 를 의미하는 " | " 를 토큰 값으로 선언 한 것입니다. 


사용 방법은 아래와 같습니다. 


1
2
3
4
5
6
String strInput = "james|tistory|regular|expression";
String[] retStr = strInput.split(regExp);
        
for(int i = 0; i < retStr.length; i++){
    System.out.println("retStr["+i+"] = "+retStr[i]);
}
cs


strInput 값에 " james | tistory | regular | expression " 이라는 변수값을 선언 했습니다. 

Sting 을 split 했을때 배열로 리턴 됩니다. (위 Java split() 함수 포스팅 참조)


결과 값을 확인하기 위해 for loop 를 돌려서 결과 값을 찍어 봤습니다. 


결과는 아래와 같습니다. 


Results

retStr[0] = james

retStr[1] = tistory

retStr[2] = regular

retStr[3] = expression




▶ 예제 2


1
String regExp = "\\s*[a-zA-Z]+";
cs


정규 표현식을 위와 같이 작성 해봤습니다. 

위 표현식은 공백문자가 0회 이상, 영문 대소문자 1회 이상인 것을 의미하는 표현식입니다. 


즉, 공백문자나 영문자가 오면 이것을 토큰으로 사용 하겠다는 의미로 작성한 표현식입니다. 


실제 예문을 보시겠습니다. 


1
2
3
4
5
6
7
8
String strTest = "a + b - c * d / e < f > g >= h <= i == j";
String[] retStr = strTest.split(regExp);
        
for (String out : retStr) {
    if (!"".equals(out)) {
        System.out.print(out);
    }
}
cs



strTest 라는 변수에 영문자, 공백문자 그리고 기타 비영문자들이 자리하고 있습니다. 

의도 한대로 표현식이 적용 된다면 공백문자 외 +, -, * 등등의 값들이 남아 있어야 합니다. 


위 코드 실행 결과는 아래와 같습니다. 


Results 

 + - * / < > >= <= ==


위 결과 값에서   는 공백문자를 의미 합니다. 


표현식에서는 조건을 공백문자(0회 이상) + 영문자(1회 이상 : 즉, 필수) 형태로 설정했기 때문에 결과가 위와 같이 나왔습니다. 


a + b - c * d / e < f > g >= h <= i == j


위 문자열에 마우스 커서를 가져가 보시면 좀더 편하게 이해 하실 수 있을 것 같습니다.

첫번째 a 를 제외 나머지 문자열들은 앞에 공백문자 + 영문자 형태로 되어 있습니다. 

결과적으로 나머지 영문자 뒤에 따라오는 공백문자 + 비영문문자의 조함이 남은 결과 값으로 리턴 되었습니다. 



최대한 쉽게 풀어 쓴다고 했는데 오히려 더 복잡해 진것 같은 느낌적인 느낌이 듭니다.


혹, 이해하기 어려운 부분이 있으신 경우 글 남겨 주시면 도움 드릴 수 있도록 하겠습니다. 





 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식을 이용하여 특정 숫자의 범위를 지정하는 방법에 대해 알아 보겠습니다. 

이번 글을 사실 앞서 포스팅한 표현식중에 사용된 적이 있는 방식인데요. 

간단히 설명하듯이 넘어갔기에 이번에 조금 더 정리 하고자 합니다. 



■ 정규표현식으로 숫자 범위 지정 패턴 만들기


로또 많이들 관심을 가지고 있을 것 같습니다. 

로또 번호는 1 ~ 45 까지의 값만 선택 가능합니다. 


이 로또 번호의 범위 1 ~ 45 까지의 숫자만 입력 가능한 패턴을 만들어 보겠습니다. 




숫자를 허용 하는 표현식은 이제 다들 아시리라 생각합니다. 

간단하죠? 


^[0-9]$


위와 같이 작성하면 어떤 숫자든 허용 한다는 의미 입니다. 하지만 딱 한자리 숫자만 체크 합니다. 


만약 입력 값이 한자리 숫자이며 0 ~ 9 사이 값이라면 위 표현식으로도 충분 하지만 지금 만들고자 하는 패턴은 한자리 숫자가 아닌 두자리 숫자로 최대 45 까지만 허용 해야 하는 조건입니다. 


지금부터 하나씩 조건을 맞춰 가보겠습니다.



^[1-9]{1}$

1 ~ 9 까지 한자리 숫를 허용하는 표현식 하나를 완성 시켰습니다. 



^[1-9]{1}$

or 를 의미하는 " | " 값을 이용하여 10 이상 ~ 45 이하를 포함하는 식을 추가 할 표현식을 연결할 준비를 합니다. 



^[1-9]{1}$|^[1-3]{1}[0-9]{1}$

첫번째 자리는 1 ~ 3 까지만 허용하고 두번째 자리는 0 ~ 9 까지 허용하는 표현식을 이용 했습니다. 

즉, 10 ~ 39 까지의 값을 허용 할 수 있는 표현식입니다. 



^[0-9]{1}$|^[1-3]{1}[0-9]{1}$|

or 를 의미하는 " | " 값을 이용하여 남은 40 ~ 45 사이의 값을 포함하는 식을 추가 합니다. 



^[0-9]{1}$|^[1-3]{1}[0-9]{1}$|^4{1}[0-5]{1}$

첫번째 자리는 4만 허용하고 두번째 자리는 0 ~ 5 까지의 숫자를 허용하는 표현식을 추가 했습니다. 

이는 40 ~ 45 까지의 값을 허용 하는 표현식입니다. 



여기까지 이해가 되셨나요? 




이제 샘플 코드를 보시 겠습니다. 


1
String regExp = "^[1-9]{1}$|^[1-3]{1}[0-9]{1}$|^4{1}[0-5]{1}$";
cs


위에서 작성한 최종 표현식을 regExp 로 선언 했습니다. 



1
2
3
4
5
6
7
8
9
String lottoNum1 = "8";
String lottoNum2 = "25";
String lottoNum3 = "45";
String lottoNum4 = "56";
 
System.out.println("lottoNum1 테스트 결과 ==> "+lottoNum1.matches(regExp));
System.out.println("lottoNum2 테스트 결과 ==> "+lottoNum2.matches(regExp));
System.out.println("lottoNum3 테스트 결과 ==> "+lottoNum3.matches(regExp));
System.out.println("lottoNum4 테스트 결과 ==> "+lottoNum4.matches(regExp));
cs


위와 같이 8, 25, 45, 56 등 네가지 값을 작성한 표현식을 이용하여 Validation check 해보겠습니다. 


실행 결과는 아래와 같습니다. 


Results 

lottoNum1 테스트 결과 ==> true

lottoNum2 테스트 결과 ==> true

lottoNum3 테스트 결과 ==> true

lottoNum4 테스트 결과 ==> false



직접 테스트 해보시면 아시겠지만 1 ~ 45 까지의 모든 값을 허용 하고 그 외의 값들은 허용하지 않습니다. 

생각보다 간단하죠? ^^


위와 같은 방법으로 원하는 표현식을 만들 수 있습니다. 




만약 0 ~ 9 사이의 숫자중 5, 6 은 허용하지 않는 다는 표현식을 만든다면 어떻게 하면 될까요? 


^[0-47-9]{1}$


0-4: 0 ~ 4 까지 허용 

7-9: 7 ~ 9 까지 허용

주의 할 점은 4와 7 이 붙어 있다고 하여 47을 의미 하는 것이 아니라 각각의 범위 지정 끝 숫자와 시작 숫자라는 겁니다.



1
String regExp = "^[0-47-9]{1}$";
cs


위 표현식을 이용하여 테스트를 해보겠습니다. 



1
2
3
4
5
String numTest1 = "4";
String numTest2 = "6";
 
System.out.println("numTest1 테스트 결과 ==> "+numTest1.matches(regExp));
System.out.println("numTest2 테스트 결과 ==> "+numTest2.matches(regExp));
cs



실행 결과는 아래와 같습니다. 


Results

numTest1 테스트 결과 ==> true

numTest2 테스트 결과 ==> false




이번 포스팅 내용을 참고 하시면 대부분의 숫자 범위 지정은 무리 없이 하실 수 있을 거라 생각합니다. 




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식을 이용한 주민등록번호 패턴을 만들어 보겠습니다. 



■ 정규표현식으로 주민등록번호 패턴 만들기


주민등록번호 구성은 아래와 같습니다. 


예) 123456 - 1234567


◎ 첫 6자리

12 ▶ 출생년도 마지막 두자리

34 ▶ 출생 월

56 ▶ 출생 일



◎ 마지막 7자리

1 ▶ 성별 (1: 남자, 2: 여자, 3: 2000년 이후 출생자 남자, 4: 2000년 이후 출생자 여자)

2345 ▶ 지역코드

6 ▶ 출생신고지 기준 접수 순번

7 ▶ 검증번호 (앞 12 자리 숫자를 특정 공식에 대입 시 딱 하나의 숫자만 나올 수 있음)



주민등록 번호는 위와 같은 구성으로 만들어 질 수 있습니다. 


이번 포스팅에서는 각각의 모든 자리의 의미를 파악하고 작업 하는 것이 아니라 간편하게 입력 받을 수 있도록 만들어 보겠습니다. 디테일링은 각자 해보시기 바라겠습니다. (혹, 어렵다면 댓글로 남겨 주세요 ㅎㅎ)


이제 패턴 만들기를 시작해 보겠습니다. 




■ 앞 6자리 패턴 만들기


▶ 출생년도 


^\\d{2}

또는 

^[0-9]{2}


위 두가지 표현식 모두 동일한 의미 입니다. 0 ~ 9 사이 두자릿수 숫자 허용



▶ 출생 월 


^\\d{2}(0[1-9]|1[0-2])


앞자리가 0일때 뒷자리는 1 ~ 9 까지 허용. 즉, 01 ~ 09 월 까지 범위 설정

또는을 의미하는 " | " 값을 이용하여 앞자리가 1일때 뒤자리가 0 ~ 2 까지 허용 되는 값을 설정하여 전체 01월 부터 12월 까지 허용 하는 코드 추가 



▶ 출생 일 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])


앞자리가 0 ~ 2 까지 허용 될때 두번째 자리는 0 ~ 9 까지 설정하여 01 ~ 09 일까지 설정

앞자리가 1 또는 2 일때는 뒷자리를 0 ~ 9 까지 모두 허용하는 것으로 설정하여 10 ~ 29 까지 허용

앞자리가 3 일때 뒷자리는 0 또는 1만 허용 하는 것으로 설정하여 30, 31 두 숫자까지 최종 허용 하는 것으로 정의 했습니다. 


결국 01 ~ 31 까지 허용 범위가 지정 되었습니다. 




■ 뒤 7자리 패턴 만들기


▶ 성별


[1-4]

첫 자리 수를 1 ~ 4 사이로 지정 했습니다. 



▶ 나머지 6자리 숫자


[1-4][0-9]{6}

성별을 제외한 나머지 6자리는 0 ~ 9 까지 모두 허용 하며 자릿수는 6자리로 지정 했습니다. 




이제 앞뒤 패턴을 합쳐보겠습니다. 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])[1-4][0-9]{6}


뭔가 좀 아쉽죠? 일반적으로 주민등록번호 쓸때 앞 6자리 와 뒤 7자리 사이에 " - " 를 사용하는데요. 이녀석을 한번 추가해 보겠습니다. 




▶ 구분자 ( - ) 추가 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])\\-[1-4][0-9]{6}$


앞 6자리와 뒤 7자리 숫자를 구분하기 위한 구분자로 ( - ) 를 추가 했습니다. 




이제 이 값을 한번 테스트 해보겠습니다. 


1
String regExp = "^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])\\-[1-4][0-9]{6}$";
cs


위와 같이 표현식을 선언 했습니다. 

앞서 작성한 주민번호 표현식입니다. 


이제 테스트 코드를 한번 보겠습니다. 


1
2
String ssn1 = "001225-4321126";
System.out.println("주민번호 1 테스트 결과 ==> " + ssn1.matches(regExp));
cs


ssn1 이라는 값이 준비한 표현식에 맞습니다. 

위 코드를 실행 하면 결과는 어떻게 나올까요? 


Results

주민번호 1 테스트 결과 ==> true



1
2
String ssn2 = "980013-1618960";
System.out.println("주민번호 2 테스트 결과 ==> " + ssn2.matches(regExp));
cs


ssn2 라는 값을 잘 보시면 월 부분이 00 으로 입력 되어 있습니다. 잘못 입력 된 값입니다. 


당연하게도 위 코드를 실행 시키면 아래와 같은 결과 값이 나옵니다. 


Results

주민번호 2 테스트 결과 ==> false



1
2
String ssn3 = "950627-7715446";
System.out.println("주민번호 3 테스트 결과 ==> " + ssn3.matches(regExp));
cs


ssn3 이라는 값의 두번째 첫 숫자가 7로 들어 왔습니다. 허용하고 있는 값은 0 ~ 4 까지 입니다. 

어떤 값이 나올지는 예상이 되시죠? 


Results

주민번호 2 테스트 결과 ==> false



사실 이 표현식도 완벽한 표현식은 아닙니다. 


예를 들어 2001년 5월 16일 생의 뒤 7자리 첫번째 숫자는 3 또는 4만 와야 하는데요.

이런 경우의 수 까지 모두 추가를 하려면 표현식이 많이 길어 지겠죠? 


하지만 지금까지 포스팅한 정규표현식 정리 내용을 보신 분들은 어쩌면!!! 당연하게도??? ㅎㅎ;; 잘 하실 수 있을꺼라 생각 됩니다. 


혹, 도전 해보시고자 하시는데 잘 안되시는 분들은 문의 남겨 주시면 도와 드리겠습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 자바 정규표현식을 이용하여 IP 주소 패턴을 만들어 보겠습니다. 

IP 주소 패턴은 앞서 작성한 포스팅을 보셨다면 아마 간단하게 만드실 수 있을 것이라 생각 됩니다. 


지금부터 시작해 보겠습니다. 



■ 정규표현식으로 IP 주소 패턴 만들기



IP 주소는 다음과 같은 형식을 취하고 있습니다. 


xxx . xxx . xxx . xxx


이는 우리가 일반적으로 많이 사용하고 있는 IP Version 4 (IPv4) 주소 체계입니다. 


각 옥텟의 xxx 값은 0 ~ 255 까지의 숫자가 올 수 있습니다. 

즉, 0.0.0.0 부터 255.255.255.25 까지의 주소가 가능합니다. 



첫번째 옥텟을 지정해 보겠습니다. 


각각의 자리에 따라 맥스 값이 다릅니다. 그리고 경우에 따라 서로 다른 값이 와야 하는 경우도 있습니다. 

예를 들면 첫자리는 0 ~ 2 까지만 올 수 있으며, 첫자리가 2일 경우 두번째 자리는 5를 넘을 수 없고, 첫자리가 1일 경우 두번째 자리는 제한이 없습니다. 


그렇기 때문에 각각의 경우의 수를 생각하고 작성해야 합니다. 



[01]?\\d?\\d

첫번째 자리는 0 또는 1만 허용하고 0 또는 1이 존재 하거나 존재하지 않아도 됩니다. 

두번째 자리는 숫자를 허용하며 값이 존재하거나 하지 않아도 됩니다. 

참고로 \d 라는 값은 [0-9] 와 동일 합니다. 

세번째 자리는 숫자를 허용하며 무조건 존재 해야 합니다. 


위 표현식으로 처리 할 수 있는 값의 범위는 0 ~ 199 까지 입니다. 


이제 남은 200 ~ 255 까지의 숫자를 처리 하면 되겠죠? 



2[0-4]\\d

첫번째 자리는 2 로 고정했습니다. 

두번째 자리는 0 ~ 4 까지의 값만 허용 합니다. 

세번째 자리는 0 ~ 9 까지의 값을 모두 허용 합니다. 


위 두번째 표현식은 200 ~ 249 까지의 값을 표현 합니다. 


이제 남은 값은 250 ~ 255 까지 입니다. 



25[0-5]

첫번째 자리는 2로 고정

두번째 자리는 5로 고정 했습니다. 

세번째 자리만 0 ~ 5 까지의 값을 허용 했습니다. 


이렇게 해서 남은 200 ~ 255 까지의 값을 커버 했습니다. 



이제 각각의 표현식을 합쳐 보겠습니다. 



[01]?\\d?\\d|2[0-4]\\d|25[0-5]

각각의 표현식을 or 를 뜻하는 " | " 기호를 이용하여 나열 했습니다. 


([01]?\\d?\\d|2[0-4]\\d|25[0-5])

여기에 ( ) 를 이용하여 감싸서 하나의 문장으로 지정 했습니다. 



여기까지가 하나의 옥텟을 정의 한 표현식입니다. 



^([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.([01]?\\d?\\d|2[0-4]\\d|25[0-5])$

이 표현식을 네번 나열하고 IP 주소를 표현할때 사용하는 마침표 ( . )를 이용하여 표현식을 수정했습니다.

그리고 마지막으로 표현식의 시작과 끝을 알리는 ^ 과 $ 를 추가 했습니다. 




위 표현식을 이용한 샘플 코드를 보겠습니다. 


1
2
3
4
String regExp = "^([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\."
                + "([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\."
                + "([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\."
                + "([01]?\\d?\\d|2[0-4]\\d|25[0-5])$";
cs


위에서 정의한 값을 적용 했습니다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
String ipNum1 = "127.0.0.1";
System.out.println("IP 주소 1 테스트 결과 ==> " + ipNum1.matches(regExp));
        
String ipNum2 = "0.0.0.0";
System.out.println("IP 주소 2 테스트 결과 ==> " + ipNum2.matches(regExp));
        
String ipNum3 = "255.255.255.255";
System.out.println("IP 주소 3 테스트 결과 ==> " + ipNum3.matches(regExp));
        
String ipNum4 = "0-0-0-0";
System.out.println("IP 주소 4 테스트 결과 ==> " + ipNum4.matches(regExp));
        
String ipNum5 = "256.0.0.1";
System.out.println("IP 주소 5 테스트 결과 ==> " + ipNum5.matches(regExp));
cs


ipNum1, ipNum2 및 ipNum3 은 정상 범위의 IP 주소 값입니다. 

하지만 네번째는 허용하지 않는 문자값이 들어 갔습니다. 

마지막은 주소 범위가 255를 벗어나 256이 입력 되어 있습니다. 


위 코드 실행 결과는 아래와 같습니다. 


Results


IP 주소 1 테스트 결과 ==> true

IP 주소 2 테스트 결과 ==> true

IP 주소 3 테스트 결과 ==> true

IP 주소 4 테스트 결과 ==> false

IP 주소 5 테스트 결과 ==> false



위 표현식은 IP Version 4 (IPv4) 를 기준으로 작성 했습니다. 

하지만 IP Version 6 (IPv6) 도 간단하겠죠? 

그냥 처음에 작성한 코드를 두번만 더 붙여 주면 끝납니다 ^^



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 자바 정규표현식을 이용하여 휴대폰 번호 패턴을 만들어 보겠습니다. 

휴대폰 번호 패턴은 생각보다 많이 사용하는 형식이니 기본적인 셋팅과 커스터마이징을 통한 패턴을 저장해 두시면 좋을 것 같습니다. 


그럼 시작해 보겠습니다. 




■ 정규표현식으로 휴대폰 번호 패턴 만들기


국내 기준으로 휴대폰 번호 패턴을 만들어 보겠습니다. 


일반적으로 휴대폰 번호는 세자리로 나뉘어져 있습니다.


첫 세자리는 아래와 같은 번호들이 올수 있습니다. 


010

011

016

017

018

019


물론 지금에서야 대부분 010 을 사용하고 있지만 아직도 구 번호 체계를 그대로 사용하고 계신분들이 계시니 무시 할 수는 없습니다. 


두번째 자리는 3 ~ 4자리의 임의의 숫자가 오면 됩니다. 


세번째 자리는 일반적으로 4자리로 지정을 많이 하고 있으니 그대로 따르는 것으로 하겠습니다. 


자릿수 사이에 아무 표기도 사용하지 않거나 " - " 로 구분 또는 " . " 로 구분 하는 것을 허용 하도록 하겠습니다. 


01012341234

010-1234-1234

010.1234.1234


위 세가지 패턴 모두 허용 하는 것으로 작성 해보겠습니다. 



▶ 첫 세자리 


^01

정규표현식 패턴의 시작을 의미 하는 ^ 를 시작으로 01 을 추가했습니다. 

문자열의 시작을 01 이라는 것을 의미합니다. 


^01(?:0|1|[6-9])

01 다음에 오는 값으로 0, 1 또는 6 ~ 9 사이 값으로 지정을 했습니다. 



▶ 두번째 자리


^01(?:0|1|[6-9])(\\d{3}|\\d{4})

3자리 또는 4자리의 숫자를 허용 하는 것으로 지정 합니다. 



▶ 세번째 자리


^01(?:0|1|[6-9])(\\d{3}|\\d{4})(\\d{4})$

마지막은 4자리 숫자로 지정 했습니다. 
그리고 표현식의 종료를 알리는 $ 로 마무리 했습니다. 



▶ 구분값 추가


휴대폰 번호를 입력 시 " - " 를 추가 하거나 국내에서는 많이 사용하지 않지만 " . " 를 추가 하는 경우가 있습니다. 

아무런 표기를 하지 않거나 " - " 또는 " . " 를 허용 하는 코드를 추가 하겠습니다. 


^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$


[.-]?

위 값은 " . " 또는 " - " 값이 없거나 단 한개만 존재 하는 것을 의미 합니다. 



제가 작성한 정규표현식 최종 모습은 아래와 같습니다. 

^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$




1
String regExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$";
cs


위와 같이 자바 코드로 작성 후 위 표현식을 테스트 해보겠습니다. 



1
2
String mobNum1 = "01012345678";
System.out.println("mobile number 1 테스트 결과 ==> " + mobNum1.matches(regExp));
cs


mobNum1 의 값이 01 로 시작했고 세번째 값이 0으로 첫번째 자리는 모두 정상적으로 들어 왔습니다. 

두번째 및 세번째 자리는 모두 숫자 값이고 7 ~ 8자리 (두자릿수 합) 의 값이어야 하는데 8자리로 이 것 역시 문제 없는 값으로 확인 됩니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 1 테스트 결과 ==> true



1
2
String mobNum2 = "010-1234-5678";
System.out.println("mobile number 2 테스트 결과 ==> " + mobNum2.matches(regExp));
cs


구분자로 " - " 를 이용했습니다. 표현식에서 허용한 문자입니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 2 테스트 결과 ==> true



1
2
String mobNum3 = "010.1234.5678";
System.out.println("mobile number 3 테스트 결과 ==> " + mobNum3.matches(regExp));
cs


두번째 예제의 구분자를 " . " 로 변경 했습니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 3 테스트 결과 ==> true



1
2
String mobNum4 = "0101234-.5678";
System.out.println("mobile number 4 테스트 결과 ==> " + mobNum4.matches(regExp));
cs


4 와 5 사이에 " - " 와 " . " 두개를 같이 사용했습니다. 

둘다 허용된 문자열이지만 둘중 한개 또는 둘다 오지 않아야 합니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 4 테스트 결과 ==> false



1
2
String mobNum5 = "110-1234-5678";
System.out.println("mobile number 5 테스트 결과 ==> " + mobNum5.matches(regExp));
cs


첫세자리는 01 로 시작을 해야 하는데 110 으로 시작 하는 것으로 지정 했습니다. 

당연히 허용되지 않는 패턴입니다. 


위 코드를 실행한 결과는 아래와 같습니다. 


Result

mobile number 5 테스트 결과 ==> false



숫자 간 구분자 값을 추가 하거나 변경하는 등의 제한하는 표현식을 원하는 방식대로 변경 적용하시면 사용 하는데 불편함이 없을 겁니다. 




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,