ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 숫자인지 여부 판별하기
    파이썬 2021. 6. 13. 21:09

     

    https://www.python.org/community/logos/

    파이썬 기반의 프로젝트를 진행하는 중,

    여러 출처에서 데이터를 수집하여 공통 테이블에 적재하는 기능을 구현해야 했다.

     

    DBMS는 PostgreSQL을 사용하였는데 number 타입 컬럼에 들어갈 데이터가 문자열이라 하더라도,

    정수 또는 실수의 숫자 형태라면 타입 캐스팅을 해서 테이블에 적재되도록 하는 요구사항이 있었다.

    따라서 해당 작업을 수행할 수 있는 검증 함수를 구현했다.

     

    먼저 아래와 같은 틀로 함수를 정의한다.

    def is_number(value):
    	is_number_flag = True
    
    	#검증 로직
    
    	return is_number_flag

     

    숫자로의 타입 캐스팅은 float() 함수를 이용하였다. 파이썬 REPL에서 아래처럼 간단히 테스트 해볼 수 있다.

    python
    
    a = '143.56'
    print(float(a))
    >>> 143.56
    
    b = 'abc'
    print(float(b))
    >>> Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: could not convert string to float: 'abc'
    
    c = None
    print(float(c))
    >>> Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: float() argument must be a string or a number, not 'NoneType'

     

    참고로 파이썬에서 isdigit(), isdecimal(), isnumeric() 함수를 제공하지만,

    음수이거나 소수점이 있는 경우에는 False를 반환한다. 따라서 이번에는 사용할 수 없었다.

    python
    
    x = '123.45'
    print(x.isdigit())
    >>> False
    
    print(x.isdecimal())
    >>> False
    
    print(x.isnumeric())
    >>> False

     

    float() 함수를 통해 검증 로직을 추가하면 아래와 같다.

    None과 같이 데이터가 없는 경우는 사전에 빈 데이터 검증 함수에서 처리하였다.

    def is_number(value):
    	is_number_flag = True
    
    	#검증 로직
    	try:
    		num = float(value)
    	except: ValueError
    		is_number_flag = False
    
    	return is_number_flag

     

    이로써 None 데이터와 숫자로 변환할 수 없는 문자열 데이터를 걸러낼 수 있게 되었다.

    그러나 한가지 문제가 있었다. 아래 테스트를 먼저 확인하자.

    python
    
    import math
    
    x = math.nan
    print(x)
    >>> nan
    
    print(float(x))
    >>> nan

     

    위와 같이 value가 NaN인 경우는 float() 함수에서 에러가 발생하지 않는다.

    하지만 NaN 데이터와 같이 활용할 수 없는 데이터는 None 처리를 하여,

    테이블 조회 시 문제가 생기지 않도록 해야 했다.

     

    즉, NaN을 거를 수 있는 로직을 추가해야 한다. 방법은 2가지이다.

     

    첫번째는 NaN의 경우 자신과 자신을 비교할 때 False를 반환한다. 아래와 같이 테스트할 수 있다.

    python
    
    import math
    
    x = math.nan
    print(x==x)
    >>> False
    
    x = float(x)
    print(x==x)
    >>> False

     

    이를 이용한 로직은 아래와 같다.

    ...
    	num = float(value)
        
    	is_number_flag = num == num

     

    두번째는 math 모듈에서 제공하는 isnan() 함수를 이용하는 것이다. 아래 내용을 보자.

    python
    
    import math
    
    x = math.nan
    print(math.isnan(x))
    >>> True

     

    이렇게 숫자인지 여부(문자열이라도 숫자로 캐스팅할 수 있는지)를 검증하는 함수를 완성하였다.

    import math
    
    def is_number(value):
    	is_number_flag = True
    
    	#검증 로직
    	try:
    		num = float(value)
    
    		#NaN 검증
    		is_number_flag = num == num
    		#또는 math.isnan(num)
    	except: ValueError
    		is_number_flag = False
    
    	return is_number_flag

    '파이썬' 카테고리의 다른 글

    Anaconda 명령어  (0) 2021.06.06

    댓글

Designed by Tistory.