HOWTO · Python

Python에서 문자열이 숫자인지 확인

이 튜토리얼은 파이썬에서 문자열이 숫자인지 확인하는 방법을 보여줍니다.

이 페이지의 내용

문자열을 Python 부동소수점 숫자로 변환할 수 있는지 확인하려면 float()를 호출하고 ValueError를 처리하세요. 이 방법은 Python의 float 문법에 따른 변환 가능 여부를 확인합니다. 애플리케이션에 따라 무한대나 NaN을 거부하는 규칙이 추가로 필요할 수도 있습니다.

float() 함수로 Python에서 문자열이 숫자인지 확인하기

다음 예제를 실행해 보세요.

print(float("22.23"))
22.23

float()는 소수 형식 문자열 외에도 정수 표기, 부호가 있는 값, 지수 표기, 앞뒤 공백이 있는 문자열을 변환할 수 있습니다. 예를 들면 "22", "-3.5", "1e3", " 4.2 "가 있습니다. "developer"나 "2.3.4"처럼 float 문법에 맞지 않는 텍스트는 ValueError를 발생시킵니다.

파일이나 다른 외부 출처에서 가져온 데이터를 처리한다면 변환을 작은 도우미 함수에 넣으세요. 변환에 성공하면 나중에 사용할 수 있도록 변환된 값을 반환하고, 실패하면 None을 반환하면 됩니다. 이렇게 하면 별도의 문자 검사로 각 값을 검증할 필요가 없습니다.

def parse_float(value):
    try:
        return float(value)
    except ValueError:
        return None


for value in ("22.23", "developer"):
    result = parse_float(value)
    print(result)
22.23
None

도우미 함수는 파싱에 성공하면 변환된 숫자를 반환하고, 그렇지 않으면 None을 반환합니다. 불리언 결과가 더 유용하다면 같은 try/except ValueError 패턴을 사용해 변환에 성공한 경우 True를, 예외 처리 부분에서 False를 반환하세요. 파싱할 수 없는 텍스트에는 ValueError를 처리해야 합니다. 이 경우를 OverflowError라고 설명하면 안 됩니다.

변환에 성공했다고 해서 값이 유한하다는 뜻은 아닙니다. Python의 float()는 지원되는 해당 표기에서 무한대나 NaN을 만들 수 있습니다. 애플리케이션에서 유한한 값만 허용해야 한다면, 변환된 결과에 math.isfinite()를 적용해 별도로 확인하세요.

isdigit() 및 partition() 함수로 Python에서 문자열이 숫자인지 확인하기

isdigit()은 문자열의 모든 문자가 숫자인지라는 더 제한적인 질문에 답합니다. 일반적인 소수 표기, 부호, 지수 표기에는 False를 반환하므로 범용 float 검증기로 사용할 수 없습니다. 예를 들어 "4546".isdigit()은 참이지만, "4546.4646".isdigit()과 "-12".isdigit()은 거짓입니다. 뒤의 두 문자열도 float()로는 변환할 수 있습니다.

직접 정의한 제한된 형식만 지원하려는 경우에 한해 partition()을 사용하세요. 예를 들어 숫자, 소수점 하나, 그 뒤의 숫자만 허용하는 형식이 이에 해당합니다. partition()은 첫 번째 구분자 앞의 텍스트, 구분자 자체, 그 뒤의 텍스트를 반환합니다. 따라서 각 부분을 명시적으로 검사하면서 규칙을 좁고 검토하기 쉽게 유지할 수 있습니다.

value = "4546.4646"
whole, point, fraction = value.partition(".")
is_simple_decimal = (
    value.count(".") == 1
    and point == "."
    and whole.isdigit()
    and fraction.isdigit()
)
print(is_simple_decimal)

이 검사는 예제에 나온 것처럼 소수점 양쪽에 숫자가 있는 형식을 허용합니다. 정수만 있는 입력, 맨 앞이나 맨 뒤에 소수점이 있는 입력, 부호, 앞뒤 공백, 지수 표기는 거부합니다. Python의 float()는 정수, 부호가 있는 값, 공백, 지수 표기 등 이 형식에서 거부하는 일부 입력도 허용하므로 이 검사는 float 파싱과 같지 않습니다. 또한 isdigit()은 일부 유니코드 숫자도 인식합니다. 입력 형식에서 ASCII 숫자만 요구한다면 ASCII 숫자 규칙을 명시적으로 사용하세요. Python float 문법에서 소수 구분자는 마침표이므로 "4,2" 같은 문자열은 4.2로 변환되지 않습니다. 데이터가 로캘별 구분자를 사용한다면 문장 부호를 조용히 바꾸지 말고 해당 입력 형식에 맞춰 파싱하세요.

직접 작성한 검사는 이러한 선택 사항의 처리 방법을 정의해야 하며, Python의 float 문법과 달라지기 쉽습니다. Python이 변환할 수 있는 값을 허용하려는 목적이라면 ValueError를 처리하면서 float()를 사용하세요.

value = "4546.4646"
print(value.isdigit())
print(float(value))
False
4546.4646