반응형
- 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() → 모든 종류의 숫자 유니코드 허용 (한자 숫자, 분수 포함)
반응형