문자열이 숫자인지 아닌지 판별하는 함수

사용자에게 숫자를 콘솔에서 Scanner 를 통해 입력받아 처리를 하는 로직을 만들려고 한다. Scanner.nextInt() 메소드를 통해 int 형 데이터의 입력을 기다린다고 가정해보자. 만약 유저가 int형이 아닌 double형이나 다른 타입의 숫자 또는 문자를 입력했을때, 에러를 띄우고 프로그램을 강제 종료한다.

그렇다면 숫자든 문자든 입력이 됐을 때, 그것이 문자인지 숫자( 정수, 실수 )인지 판별하는 로직을 만들어주어야 한다.

  • 숫자도 문자이기 때문에 일단 Scanner 를 통해 문자열을 입력 받는다.
  • 반복문을 통해 문자열의 문자 하나하나의 아스키 코드값을 비교해서 0 ~ 9 (ASKII: 48 ~ 57) 사이에 있는지 체크해준다.
    • ASKII 코드 는 문자를 숫자로 표현하는 표준 코드이다.
    • 더 정확한 내용은 링크를 확인하면 된다. ASKII코드란?
  • 만약 문자가 위 범위를 벗어난다면 그것은 숫자가 아닌 다른 문자이다.
    • 하지만 범위를 벗어난 문자가 . 라면 실수로 판단하고 반복문을 계속 실행한다.
  • 따라서 반복문이 정상적으로 끝까지 돌면 숫자이고, 중간에 멈추면 문자가 포함된 문자열이다.
    • . 의 개수가 2개 이상이면 수가 아닌 문자열로 판단한다.



코드

class checkIntClass {
  public static void main(String[] args) {
    //입력된 수가 정수인지 실수인지 판별하는 함수 제작
    Scanner scanner = new Scanner(System.in);
    System.out.print("숫자를 입력: ");
    String num = scanner.next();	//문자열을 입력받음
    if (isNumber(num)) {
      System.out.println("숫자 입니다.");
    } else {
      System.out.println("숫자가 아닙니다");
    }
  }

  //문자열이 숫자(정수, 실수)인지 아닌지 판별한다.
  static boolean isNumber(String str) {
    char tempCh;
    int dotCount = 0;	//실수일 경우 .의 개수를 체크하는 변수
    boolean result = true;

    for (int i=0; i<str.length(); i++){
      tempCh= str.charAt(i);	//입력받은 문자열을 문자단위로 검사
      //아스키 코드 값이 48 ~ 57사이면 0과 9사이의 문자이다.
      if ((int)tempCh < 48 || (int)tempCh > 57){
        //만약 0~9사이의 문자가 아닌 tempCh가 .도 아니거나
        //.의 개수가 이미 1개 이상이라면 그 문자열은 숫자가 아니다.
        if(tempCh!='.' || dotCount > 0){
          result = false;
          break;
        }else{
          //.일 경우 .개수 증가
          dotCount++;
        }
      }
    }
    return result;
  }
}
숫자를 입력: 12.542
숫자 입니다

숫자를 입력: 12axi231
숫자가 아닙니다

숫자를 입력: 12.5458.2
숫자가 아닙니다



정리

Scanner를 통해 입력을 받으려면 자료형 별로 다른 입력 함수를 사용해야한다. 그로 인해 int형 변수의 입력을 기다리는 메소드에 double 형 데이터를 입력하면 에러가 난다.

이를 해결하기 위해 일단 문자열의 입력을 받는 .next()를 사용한다. 숫자와 문자 구별없이 문자열 전체를 입력 받기 때문에 에러가 나지 않는다.

입력 받은 문자열을 문자 하나하나 쪼개서 문자 0 ( ASKII코드 값 48 )부터 문자 9 ( ASKII코드 값 48 )까지의 ASKII코드 값을 비교한다. 쪼갠 문자의 아스키 코드값이 48과 57사이에 없다면 이는 숫자가 아닌 다른 문자인 것이다. 따라서 그 문자열은 숫자가 아닌 다른 문자열을 포함하고 있기 때문에 false 를 리턴 받는다.

하지만 실수를 표현하는데 사용하는 . 의 개수가 1개라면 실수로 판단하여 true 를 리턴한다.

Comments