Java/문자열

[Java]문자열이 숫자인지 체크하는 방법

DevStory 2022. 9. 6.

문자열이 숫자인지 체크하는 방법

Java에서 문자열이 숫자인지 아닌지 체크해야 하는 상황이 발생할 수 있습니다.

 

[예시]

- "10.25" → 숫자(O)

- "10.1.1.1" → 숫자(X)

- "0" → 숫자(O)

- "0.0000" → 숫자(O)

- "-10" → 숫자(O)

- "-10.1020" → 숫자(O)

- "+10" → 숫자(O)

- "-10.1020" → 숫자(O)

 

이번 포스팅은 Java에서 제공하는 래퍼 클래스와 정규식을 사용하여 문자열이 숫자인지 아닌지 체크하는 방법을 소개합니다. 래퍼 클래스와 정규식 이외에도 문자열이 숫자인지 아닌지 체크할 수 있는 다양한 방법이 존재하지만, +, - 문자를 제대로 체크하지 못하므로 권장하지 않습니다.


방법 1. 래퍼 클래스 사용

Java에서 제공하는 숫자 타입인 래퍼 클래스를 사용하여 문자열이 숫자인지 체크할 수 있습니다.

 

[정수 타입]

- Integer

- Long

 

[부동 소수점 타입]

- Float

- Double


예제 1. 정수 타입

문자열이 정수인지 확인하고 싶은 경우 Integer 클래스의 parseInt() 메서드와 Long 클래스의 parseLong() 메서드를 사용할 수 있습니다.

 

parseInt() 메서드와 parseLong() 메서드는 매개변수로 전달받은 문자열을 정수로 변환된 값을 반환합니다. 만약, 문자열이 정수가 아닌 경우 NumberFormatException이 발생합니다.

※ valueOf() 메서드
또 다른 방법으로 valueOf() 메서드를 사용할 수 있지만, valueOf() 메서드는 내부적으로 parseInt() 메서드와 parseLong() 메서드를 호출합니다.

가장 큰 차이점은 valueOf() 메서드는 정수를 래퍼 클래스 타입(Integer, Long)으로 반환하고 parseInt() 메서드와 parseLong() 메서드는 정수를 기본 타입(int, long)으로 반환합니다.

다음 예제는 숫자로 구성된 문자열이 정수인지 확인합니다.

public class MainForm {
  public static boolean isInteger(String strValue) {
    try {
      Integer.parseInt(strValue);
      return true;
    } catch (NumberFormatException ex) {
      return false;
    }
  }

  public static boolean isLong(String strValue) {
    try {
      Long.parseLong(strValue);
      return true;
    } catch (NumberFormatException ex) {
      return false;
  }

  public static void main(String args[]) {
    System.out.println("[Integer 클래스의 parseInt() 메서드 사용]");
    System.out.println("+10은 정수인가? " + isInteger("+10"));
    System.out.println("-10은 정수인가? " + isInteger("-10"));
    System.out.println("+0은 정수인가? " + isInteger("+0"));
    System.out.println("1.1.1은 정수인가? " + isInteger("1.1.1"));

    System.out.println("\n[Long 클래스의 parseLong() 메서드 사용]");
    System.out.println("+10은 정수인가? " + isLong("+10"));
    System.out.println("-10은 정수인가? " + isLong("-10"));
    System.out.println("+0은 정수인가? " + isLong("+0"));
    System.out.println("1.1.1은 정수인가? " + isLong("1.1.1"));
  }
}

[실행 결과]

[Integer 클래스의 parseInt() 메서드 사용]
+10은 정수인가? true
-10은 정수인가? true
+0은 정수인가? true
1.1.1은 정수인가? false

[Long 클래스의 parseLong() 메서드 사용]
+10은 정수인가? true
-10은 정수인가? true
+0은 정수인가? true
1.1.1은 정수인가? false

예제 2. 부동 소수점 타입

문자열이 부동 소수점인지 확인하고 싶은 경우 Float 클래스의 parseFloat() 메서드와 Double 클래스의 parseDouble() 메서드를 사용할 수 있습니다.

 

parseFloat() 메서드와 parseDouble() 메서드는 매개변수로 전달받은 문자열을 부동 소수점으로 변환된 값을 반환합니다. 만약, 문자열이 부동 소수점이 아닌 경우 NumberFormatException이 발생합니다.

※ valueOf() 메서드
또 다른 방법으로 valueOf() 메서드를 사용할 수 있지만, valueOf() 메서드는 내부적으로 parseFloat() 메서드와 parseDouble() 메서드를 호출합니다.

가장 큰 차이점은 valueOf() 메서드는 부동 소수점을 래퍼 클래스 타입(Float, Double)으로 반환하고 parseFloat() 메서드와 parseDouble() 메서드는 부동 소수점을 기본 타입(float, double)으로 반환합니다.

다음 예제는 숫자로 구성된 문자열이 부동 소수점인지 확인합니다.

public class MainForm {
  public static boolean isFloat(String strValue) {
    try {
      Float.parseFloat(strValue);
      return true;
    } catch (NumberFormatException ex) {
      return false;
    }
  }

  public static boolean isDouble(String strValue) {
    try {
      Double.parseDouble(strValue);
      return true;
    } catch (NumberFormatException ex) {
      return false;
    }
  }

  public static void main(String args[]) {
    System.out.println("[Float 클래스의 parseFloat() 메서드 사용]");
    System.out.println("+10.12는 부동 소수점인가? " + isFloat("+10.12"));
    System.out.println("-10.12는 부동 소수점인가? " + isFloat("-10.12"));
    System.out.println("+0는 부동 소수점인가? " + isFloat("+0"));
    System.out.println("1.1.1는 부동 소수점인가? " + isFloat("1.1.1"));

    System.out.println("\n[Double 클래스의 parseDouble() 메서드 사용]");
    System.out.println("+10.12는 부동 소수점인가? " + isDouble("+10.12"));
    System.out.println("-10.12는 부동 소수점인가? " + isDouble("-10.12"));
    System.out.println("+0는 부동 소수점인가? " + isDouble("+0"));
    System.out.println("1.1.1는 부동 소수점인가? " + isDouble("1.1.1"));
  }
}

[실행 결과]

[Float 클래스의 parseFloat() 메서드 사용]
+10.12는 부동 소수점인가? true
-10.12는 부동 소수점인가? true
+0는 부동 소수점인가? true
1.1.1는 부동 소수점인가? false

[Double 클래스의 parseDouble() 메서드 사용]
+10.12는 부동 소수점인가? true
-10.12는 부동 소수점인가? true
+0는 부동 소수점인가? true
1.1.1는 부동 소수점인가? false

방법 2. 정규 표현식

두 번째 방법으로 정규 표현식을 사용하여 문자열이 숫자인지 체크할 수 있습니다.

 

[-+]?

- 문자열 맨 앞에 + 문자와 - 문자를 허용합니다.

 

\\d*

- 문자열에 최소한 하나 이상의 숫자가 존재해야 합니다.

 

\\.\\d+

- 0 ~ 1개의 소수점을 허용합니다.

 

다음 예제는 정규 표현식을 사용하여 문자열이 숫자인지 체크합니다.

public class MainForm {
  public static boolean isNumber(String strValue) {
    return strValue != null && strValue.matches("[-+]?\\d*\\.?\\d+");
  }

  public static void main(String args[]) {
    System.out.println("+10.12는 숫자인가? " + isNumber("+10.12"));
    System.out.println("-10.12는 숫자인가? " + isNumber("-10.12"));
    System.out.println("+0는 숫자인가? " + isNumber("+0"));
    System.out.println("-0는 숫자인가? " + isNumber("-0"));
    System.out.println("-0.000는 숫자인가? " + isNumber("-0.000"));
    System.out.println("1.1.1는 숫자인가? " + isNumber("1.1.1"));
    System.out.println("+는 숫자인가? " + isNumber("+"));
  }
}

[실행 결과]

+10.12는 숫자인가? true
-10.12는 숫자인가? true
+0는 숫자인가? true
-0는 숫자인가? true
-0.000는 숫자인가? true
1.1.1는 숫자인가? false
+는 숫자인가? false
반응형

댓글