본문 바로가기
Python

[Python] str.isdigit()/str.isdecimal()/str.isnumeric()

by huginn30 2025. 4. 12.
반응형

- isdigit()과 isdecimal(), isnumeric()은 Python 문자열 메서드

- 문자열이 숫자로만 구성되어 있는지를 판별


✅ isdecimal()

  • 엄격한 숫자 판별: 0~9까지의 **아라비아 숫자(Unicode Category Nd)**만 허용합니다.
  • 주로 정수 값으로 변환 가능한 문자열인지 확인할 때 사용합니다.
print("123".isdecimal())     # True
print("½".isdecimal())       # False (분수)
print("²".isdecimal())       # False (제곱 기호)

✅ isdigit()

  • isdecimal()이 허용하는 문자 + 숫자로 간주되는 다른 유니코드 기호들도 포함합니다.
  • 예: 제곱기호(²), 분수(½), 원 문자(①) 등도 허용.
print("123".isdigit())       # True
print("²".isdigit())         # True
print("½".isdigit())         # False (이건 심지어 digit도 아님)
print("①".isdigit())         # True

🤔  isdecimal() vs isdigit() vs isnumeric() 비교

메서드 설명 예시 문자 '0-9' '²'(제곱) '①'(원문자) '⅓' '一' (한자 1)
isdecimal() 가장 제한적, 0~9 아라비아 숫자만 허용 0~9
isdigit() isdecimal() + 제곱기호, 원 문자 등 0~9, ², ①
isnumeric() 가장 포괄적, 모든 숫자 유니코드 기호 허용 0~9, ², ①, ⅓, 一 등

🔍 예시 코드

print("123".isdecimal())   # True
print("123".isdigit())     # True
print("123".isnumeric())   # True

print("²".isdecimal())     # False
print("²".isdigit())       # True
print("²".isnumeric())     # True

print("⅓".isdecimal())     # False
print("⅓".isdigit())       # False
print("⅓".isnumeric())     # True

print("一".isdecimal())     # False
print("一".isdigit())       # False
print("一".isnumeric())     # True

✅ 요약

- isdecimal(): 숫자처럼 생긴 것 중 진짜 숫자(0~9)만 허용

- isdigit(): 기호처럼 보이는 숫자도 포함

- isnumeric(): 숫자로 해석될 수 있는 모든 유니코드 문자 포함 (한자 숫자 등도 포함됨)


📌 언제 어떤 걸 써야 할까?

- 정수 변환 (int) 가능한지만 확인할 때 → isdecimal()

- 숫자로 보이는 다양한 유니코드 숫자(기호)까지 포함된 숫자 문자열을 다룰 때 → isdigit()

- 문자적으로 숫자를 표현한 모든 형태를 허용할 때 → isnumeric()


🧠 isdecimal(), isdigit(), isnumeric() 유니코드 범주 비교

유니코드 Category 설명 포함 여부

    isdecimal()
Nd Decimal Number (0~9 등)
Nl Letter Number (로마 숫자 등)
No Other Number (⅓, ², ① 등)

🏷️ 예시 문자별 분류

문자 설명 Unicode Category isdecimal() isdigit() isnumeric()

3 아라비아 숫자 Nd
² 제곱기호 (superscript 2) No
원 문자 숫자 No
분수 (one-third) No
한자 숫자(일) Nl

🧪 유니코드 범주 확인하는 팁

import unicodedata

chars = ['3', '²', '①', '⅓', '一']
for c in chars:
    print(f"{c}: {unicodedata.name(c)} - {unicodedata.category(c)}")

결과로 나오는 카테고리:

  • Nd = Decimal Digit
  • Nl = Letter Number
  • No = Other Number

✅ 요약 한줄 정리

  • isdecimal() → 엄격한 숫자 (0~9)
  • isdigit() → 숫자처럼 보이는 기호까지 포함
  • isnumeric() → 모든 종류의 숫자 유니코드 허용 (한자 숫자, 분수 포함)

 

반응형