JAVA 문자열인지 숫자인지 체크 정규식 표현 사용

자바에서 문자열 안에 저장되어 있는 값이 숫자 형태인지 아닌지 확인하는 방법을 알아보겠습니다.

확인 하는 방법으로는 정규식 표현을 사용하겠습니다.

문자열 안에 저장되어 있는 값이 숫자 처럼 보여도 IP주소라면 연사자를 사용해 더하기나 빼기를 하면 값이 이상하게 나오는 경우가 생깁니다.

경우에 따라서는 에러가 발생하기도 합니다.

이러한 경우를 미리 방지하기 위해 숫자인지 아닌지 미리 판별하는 경우도 있습니다.

그럼 예시를 보면서 샘플을 확인해보도록 하겠습니다.

 

숫자인지 확인 방법

자바에서 문자열에 아래처럼 숫자들을 넣을 수 있습니다.

“0” → 숫자

“110” → 숫자

“-10” → 숫자

“+10” → 숫자

“0.01” → 숫자

“10.01” → 숫자

“172.0.0.1” → 문자열

 

일반적으로 사용하는 숫자 형태가 아닌 값은 문자열이라고 정하겠습니다.

문자열안에 들어있는 값을 연산자를 사용해 더하기 또는 빼기 나누기등 연산을 하기 위해서는 형변환하게 됩니다.

형변환을 하는 과정에서 숫자 형태 또는 지정한 형태의 타입이 아닌경우 NumberFormatException이 발생합니다.

NumberFormatException이 발생하기 때문에 catch에서 예외 처리로 로직을 만드는 경우도 많습니다.

정규식 표현을 사용해서 숫자인이 아닌지 미리 판단하는 이유는 이러한 예외처리 부분을 따로 만들고 싶지 않은 경우에 사용하는 경우도 많습니다.

숫자인지 아닌지 확인하는 정규식 샘플을 보도록 하겠습니다.

public class Program
{
    public static void main(String[] args) {
        System.out.println("0 : " + "0".matches("[-+]?\\d+(\\.?\\d+)?"));
        System.out.println("110 : " + "110".matches("[-+]?\\d+(\\.?\\d+)?"));
        System.out.println("-10 : " + "-10".matches("[-+]?\\d+(\\.?\\d+)?"));
        System.out.println("+10 : " + "+10".matches("[-+]?\\d+(\\.?\\d+)?"));
        System.out.println("0.01 : " + "0.01".matches("[-+]?\\d+(\\.?\\d+)?"));
        System.out.println("10.01 : " + "10.01".matches("[-+]?\\d+(\\.?\\d+)?"));
        System.out.println("172.0.0.1 : " + "172.0.0.1".matches("[-+]?\\d+(\\.?\\d+)?"));
	}
}

 

결과

0 : true
110 : true
-10 : true
+10 : true
0.01 : true
10.01 : true
172.0.0.1 : false

 

정규식을 사용해 문자열에 대입한 값이 숫자 형태인지 아닌지 확인하고 있습니다.

숫자 형태 값이면은 true, 숫자 형태가 아니면false를 반환하고 있습니다.

샘플에서 사용한 정규식을 보겠습니다.

[-+]?\\d+(\\.?\\d+)?

 

정규식 표현을 작성할 수 있는 함수인 matches에 정규식을 작성합니다.

[-+]?

문자열 앞에 플러스 기호와 마이너스 기호가 있어도 숫자로 인식하도록 지정한 부분입니다.

 

\\d*

문자열에 하나 이상의 숫자가 존재하는지 체크를 하는 부분입니다.

 

\\.?

최대 1개의 소수점을 허용합니다.

 

\\d+

소수점 뒤에 숫자가 있는지 체크합니다.

샘플 코드에서는 괄호 안에 (\\.?\\d+)? 로 작성했기 때문에 소수점이 있는 경우에만 숫자가 존재하는지 세트로 체크를 하고 있습니다.

위 샘플 코드에서 작성한 정규식 패턴을 함수로 만들어 사용하는 예제를 보겠습니다.

public class Program
{

    public static boolean regNumber(String strVal) {
        return strVal != null && strVal.matches("[-+]?\\d+(\\.?\\d+)?");
    }

    public static void main(String[] args) {
        System.out.println("0 : " + regNumber("0"));
        System.out.println("7 : " + regNumber("7"));
        System.out.println("110 : " + regNumber("110"));
        System.out.println("-10 : " + regNumber("-10"));
        System.out.println("+10 : " + regNumber("+10"));
        System.out.println("0.01 : " + regNumber("0.01"));
        System.out.println("10.01 : " + regNumber("10.01"));
        System.out.println("1. : " + regNumber("1."));
        System.out.println(".1 : " + regNumber(".1"));
        System.out.println("172.0.0.1 : " + regNumber("172.0.0.1"));
        System.out.println("Abc1 : " + regNumber("Abc1"));

	}
}

 

결과

0 : true
7 : true
110 : true
-10 : true
+10 : true
0.01 : true
10.01 : true
1. : false
.1 : false
172.0.0.1 : false
Abc1 : false

 

regNumber 라는 사용자 함수를 만들었습니다.

사용자 함수 안에 정규식 표현을 작성해 문자열 안에 값이 숫자 형태인지 아닌지 확인하고 있습니다.

반환값으로는 boolean으로 숫자 형태 값이면은 true, 숫자 형태가 아니면false를 반환하고 있습니다.

 

댓글