Python: isdigit() vs. isdecimal()

See Python: Tips and Tricks for similar articles.

The difference between str.isdigit() and str.isdecimal() in Python is, for most of us, academic and can be used interchangeably. According to the Python documentation, the decimal category “includes digit characters, and all characters that can be used to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.”

So, all decimals are digits, but not all digits are decimals. It turns out that most are though. Here’s a small Python script that returns the Unicode characters that are decimals but not digits.

import unicodedata
count=1
digitcount=0
decimalcount=0
print("#","Integer","Unicode Name","Character","HTML",sep="\t")
for i in range(1,1114111):
    if chr(i).isdigit() and not chr(i).isdecimal():
        try:
            print(count,i,unicodedata.name(chr(i)),chr(i), "" + str(i) + ";",sep="\t")
        except:
            print("??", "" + str(i) + ";",sep="\t")
        count=count+1
    if chr(i).isdigit():
        digitcount=digitcount+1
    if chr(i).isdecimal():
        decimalcount=decimalcount+1
    
print("digit count:",digitcount)
print("decimal count:",decimalcount)

Note that some of the characters cannot be printed out in the Python Shell or in the browser. The table shows both the character from the Python Shell (when possible) and the HTML char ref.

Python: Digits that are not Decimals
#IntegerUnicode NameCharacterHTML
1178SUPERSCRIPT TWO²²
2179SUPERSCRIPT THREE³³
3185SUPERSCRIPT ONE¹¹
44969ETHIOPIC DIGIT ONE፩፩
54970ETHIOPIC DIGIT TWO፪፪
64971ETHIOPIC DIGIT THREE፫፫
74972ETHIOPIC DIGIT FOUR፬፬
84973ETHIOPIC DIGIT FIVE፭፭
94974ETHIOPIC DIGIT SIX፮፮
104975ETHIOPIC DIGIT SEVEN፯፯
114976ETHIOPIC DIGIT EIGHT፰፰
124977ETHIOPIC DIGIT NINE፱፱
136618NEW TAI LUE THAM DIGIT ONE᧚᧚
148304SUPERSCRIPT ZERO⁰⁰
158308SUPERSCRIPT FOUR⁴⁴
168309SUPERSCRIPT FIVE⁵⁵
178310SUPERSCRIPT SIX⁶⁶
188311SUPERSCRIPT SEVEN⁷⁷
198312SUPERSCRIPT EIGHT⁸⁸
208313SUPERSCRIPT NINE⁹⁹
218320SUBSCRIPT ZERO₀₀
228321SUBSCRIPT ONE₁₁
238322SUBSCRIPT TWO₂₂
248323SUBSCRIPT THREE₃₃
258324SUBSCRIPT FOUR₄₄
268325SUBSCRIPT FIVE₅₅
278326SUBSCRIPT SIX₆₆
288327SUBSCRIPT SEVEN₇₇
298328SUBSCRIPT EIGHT₈₈
308329SUBSCRIPT NINE₉₉
319312CIRCLED DIGIT ONE①①
329313CIRCLED DIGIT TWO②②
339314CIRCLED DIGIT THREE③③
349315CIRCLED DIGIT FOUR④④
359316CIRCLED DIGIT FIVE⑤⑤
369317CIRCLED DIGIT SIX⑥⑥
379318CIRCLED DIGIT SEVEN⑦⑦
389319CIRCLED DIGIT EIGHT⑧⑧
399320CIRCLED DIGIT NINE⑨⑨
409332PARENTHESIZED DIGIT ONE⑴⑴
419333PARENTHESIZED DIGIT TWO⑵⑵
429334PARENTHESIZED DIGIT THREE⑶⑶
439335PARENTHESIZED DIGIT FOUR⑷⑷
449336PARENTHESIZED DIGIT FIVE⑸⑸
459337PARENTHESIZED DIGIT SIX⑹⑹
469338PARENTHESIZED DIGIT SEVEN⑺⑺
479339PARENTHESIZED DIGIT EIGHT⑻⑻
489340PARENTHESIZED DIGIT NINE⑼⑼
499352DIGIT ONE FULL STOP⒈⒈
509353DIGIT TWO FULL STOP⒉⒉
519354DIGIT THREE FULL STOP⒊⒊
529355DIGIT FOUR FULL STOP⒋⒋
539356DIGIT FIVE FULL STOP⒌⒌
549357DIGIT SIX FULL STOP⒍⒍
559358DIGIT SEVEN FULL STOP⒎⒎
569359DIGIT EIGHT FULL STOP⒏⒏
579360DIGIT NINE FULL STOP⒐⒐
589450CIRCLED DIGIT ZERO⓪⓪
599461DOUBLE CIRCLED DIGIT ONE⓵⓵
609462DOUBLE CIRCLED DIGIT TWO⓶⓶
619463DOUBLE CIRCLED DIGIT THREE⓷⓷
629464DOUBLE CIRCLED DIGIT FOUR⓸⓸
639465DOUBLE CIRCLED DIGIT FIVE⓹⓹
649466DOUBLE CIRCLED DIGIT SIX⓺⓺
659467DOUBLE CIRCLED DIGIT SEVEN⓻⓻
669468DOUBLE CIRCLED DIGIT EIGHT⓼⓼
679469DOUBLE CIRCLED DIGIT NINE⓽⓽
689471NEGATIVE CIRCLED DIGIT ZERO⓿⓿
6910102DINGBAT NEGATIVE CIRCLED DIGIT ONE❶❶
7010103DINGBAT NEGATIVE CIRCLED DIGIT TWO❷❷
7110104DINGBAT NEGATIVE CIRCLED DIGIT THREE❸❸
7210105DINGBAT NEGATIVE CIRCLED DIGIT FOUR❹❹
7310106DINGBAT NEGATIVE CIRCLED DIGIT FIVE❺❺
7410107DINGBAT NEGATIVE CIRCLED DIGIT SIX❻❻
7510108DINGBAT NEGATIVE CIRCLED DIGIT SEVEN❼❼
7610109DINGBAT NEGATIVE CIRCLED DIGIT EIGHT❽❽
7710110DINGBAT NEGATIVE CIRCLED DIGIT NINE❾❾
7810112DINGBAT CIRCLED SANS-SERIF DIGIT ONE➀➀
7910113DINGBAT CIRCLED SANS-SERIF DIGIT TWO➁➁
8010114DINGBAT CIRCLED SANS-SERIF DIGIT THREE➂➂
8110115DINGBAT CIRCLED SANS-SERIF DIGIT FOUR➃➃
8210116DINGBAT CIRCLED SANS-SERIF DIGIT FIVE➄➄
8310117DINGBAT CIRCLED SANS-SERIF DIGIT SIX➅➅
8410118DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN➆➆
8510119DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT➇➇
8610120DINGBAT CIRCLED SANS-SERIF DIGIT NINE➈➈
8710122DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE➊➊
8810123DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO➋➋
8910124DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE➌➌
9010125DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR➍➍
9110126DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE➎➎
9210127DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX➏➏
9310128DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN➐➐
9410129DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT➑➑
9510130DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE➒➒
9668160KHAROSHTHI DIGIT ONE??𐩀
9768161KHAROSHTHI DIGIT TWO??𐩁
9868162KHAROSHTHI DIGIT THREE??𐩂
9968163KHAROSHTHI DIGIT FOUR??𐩃
10069216RUMI DIGIT ONE??𐹠
10169217RUMI DIGIT TWO??𐹡
10269218RUMI DIGIT THREE??𐹢
10369219RUMI DIGIT FOUR??𐹣
10469220RUMI DIGIT FIVE??𐹤
10569221RUMI DIGIT SIX??𐹥
10669222RUMI DIGIT SEVEN??𐹦
10769223RUMI DIGIT EIGHT??𐹧
10869224RUMI DIGIT NINE??𐹨
10969714BRAHMI NUMBER ONE??𑁒
11069715BRAHMI NUMBER TWO??𑁓
11169716BRAHMI NUMBER THREE??𑁔
11269717BRAHMI NUMBER FOUR??𑁕
11369718BRAHMI NUMBER FIVE??𑁖
11469719BRAHMI NUMBER SIX??𑁗
11569720BRAHMI NUMBER SEVEN??𑁘
11669721BRAHMI NUMBER EIGHT??𑁙
11769722BRAHMI NUMBER NINE??𑁚
118127232DIGIT ZERO FULL STOP??🄀
119127233DIGIT ZERO COMMA??🄁
120127234DIGIT ONE COMMA??🄂
121127235DIGIT TWO COMMA??🄃
122127236DIGIT THREE COMMA??🄄
123127237DIGIT FOUR COMMA??🄅
124127238DIGIT FIVE COMMA??🄆
125127239DIGIT SIX COMMA??🄇
126127240DIGIT SEVEN COMMA??🄈
127127241DIGIT EIGHT COMMA??🄉
128127242DIGIT NINE COMMA??🄊

Of the 1,114,111 Unicode characters, there are 588 digits, 460 of which are also decimals. So, there you are. 🙂

So, which should you use? It doesn’t make much difference really, but isdigit() is the most popular, perhaps because the name most closely matches the intention of the function.