2011년 4월 1일 금요일

[Python] isdigit()의 함정

isdigit()는 음수나 소숫점이 포함된 숫자는 False를 리턴한다. 대충 생각해서는 왠지 될 것 같은데 안된다.
>>> "123".isdigit()
True
>>> "-123".isdigit()
False
>>> "1.23".isdigit()
False
사실 영어의 의미를 제대로 파악하고 있다면 문제가 되는 내용은 아니다. isdigit()는 문자열에서 사용되는 메소드로 '문자열이 숫자로 구성되어 있는가' 라는 것을 확인해 주는 메소드일 뿐이다.

하지만 원하는 데로, 음수나 소숫점이 포함된 숫자의 문자열을 제대로 파악하는 건 어떻게 해야 할까.

가장 직관적으로 처리할 수 있는 방법은 정규표현식을 이용하는 방법일 것이다. 하지만 귀찮다. 대신 다른 방법을 이용해보자.
def is_digit(str):
...   try:
...     tmp = float(str)
...     return True
...   except ValueError:
...     return False
... 
>>> is_digit("123")
True
>>> is_digit("-123")
True
>>> is_digit("23.45")
True
>>> is_digit("a12")
False
float()를 이용한 이유는 소숫점도 포함하기 위함이다. 어쨌든 형 변환 시 발생하는 예외(exception)을 활용한 예이다.

공식 API 같은게 있을 지도 모르겠지만 이렇게도 할 수 있다는 것에 의미를 두자. (- _ -)