web-dev-qa-db-ja.com

Pythonのstr.isdigit、isnumeric、isdecimalの違いは何ですか?

これらのメソッドを実行すると

s.isdigit()
s.isnumeric()
s.isdecimal()

私は常に出力として取得するか、sの各値(もちろん文字列)に対してすべてTrueまたはすべてFalseを取得しました。 3つの違いは何ですか? 2つの真理と1つの偽(またはその逆)を与える例を提供できますか?

41
user8225026

それは主にユニコード分類についてです。不一致を示すための例を次に示します。

>>> def spam(s):
...     for attr in 'isnumeric', 'isdecimal', 'isdigit':
...         print(attr, getattr(s, attr)())
...         
>>> spam('½')
isnumeric True
isdecimal False
isdigit False
>>> spam('³')
isnumeric True
isdecimal False
isdigit True

具体的な動作は公式ドキュメントにあります here

それらすべてを見つけるスクリプト:

import sys
import unicodedata
from collections import defaultdict

d = defaultdict(list)
for i in range(sys.maxunicode + 1):
    s = chr(i)
    t = s.isnumeric(), s.isdecimal(), s.isdigit()
    if len(set(t)) == 2:
        try:
            name = unicodedata.name(s)
        except ValueError:
            name = f'codepoint{i}'
        print(s, name)
        d[t].append(s)
42
wim

Pythonドキュメントには、3つの方法の違いが記載されています。

str.isdigit

文字列内のすべての文字が数字で、少なくとも1つの文字がある場合はtrueを返し、そうでない場合はfalseを返します。 数字には、互換性上付き数字など、特別な処理が必要な10進文字と数字が含まれます。これは、Kharosthiの数字のように、10進数で数字を形成するために使用できない数字を対象としています。正式には、数字はプロパティ値がNumeric_Type = DigitまたはNumeric_Type = Decimalである文字です。

str.isnumeric

文字列内のすべての文字が数字であり、少なくとも1つの文字がある場合はtrueを返し、そうでない場合はfalseを返します。 数字には数字、およびUnicode数値プロパティを持つすべての文字が含まれます。 U + 2155、ブルガー分数1/5。正式には、数字は、プロパティ値がNumeric_Type = Digit、Numeric_Type = Decimal、またはNumeric_Type = Numericであるものです。

str.isdecimal

文字列内のすべての文字が10進文字で、少なくとも1つの文字がある場合はtrueを返し、そうでない場合はfalseを返します。 10進文字は、10進数で数値を形成するために使用できる文字です。 U + 0660、アラビア語-インドの桁ゼロ正式には、小数点文字は、Unicode General Category“ Nd”の文字です。


@Wimが言ったように、3つのメソッドの主な違いは、特定のUnicode文字を処理する方法です。

25
Christian Dean

定義により、isdecimal()isdigit()isnumeric()。つまり、文字列がdecimalの場合、digitおよびnumericにもなります。

したがって、文字列sを指定し、これらの3つのメソッドでテストすると、結果は4種類のみになります。

+-------------+-----------+-------------+----------------------------------+
| isdecimal() | isdigit() | isnumeric() |          Example                 |
+-------------+-----------+-------------+----------------------------------+
|    True     |    True   |    True     | "038", "੦੩੮", "038"           |
|  False      |    True   |    True     | "⁰³⁸", "????⒊⒏", "⓪③⑧"          |
|  False      |  False    |    True     | "↉⅛⅘", "ⅠⅢⅧ", "⑩⑬㊿", "壹貳參"  |
|  False      |  False    |  False      | "abc", "38.0", "-38"             |
+-------------+-----------+-------------+----------------------------------+

1。文字のいくつかの例isdecimal()==True

(したがってisdigit()==Trueおよびisnumeric()==True

"0123456789"  DIGIT ZERO~NINE
"٠١٢٣٤٥٦٧٨٩"  ARABIC-INDIC DIGIT ZERO~NINE
"०१२३४५६७८९"  DEVANAGARI DIGIT ZERO~NINE
"০১২৩৪৫৬৭৮৯"  BENGALI DIGIT ZERO~NINE
"੦੧੨੩੪੫੬੭੮੯"  GURMUKHI DIGIT ZERO~NINE
"૦૧૨૩૪૫૬૭૮૯"  GUJARATI DIGIT ZERO~NINE
"୦୧୨୩୪୫୬୭୮୯"  ORIYA DIGIT ZERO~NINE
"௦௧௨௩௪௫௬௭௮௯"  TAMIL DIGIT ZERO~NINE
"౦౧౨౩౪౫౬౭౮౯"  TELUGU DIGIT ZERO~NINE
"೦೧೨೩೪೫೬೭೮೯"  KANNADA DIGIT ZERO~NINE
"൦൧൨൩൪൫൬൭൮൯"  MALAYALAM DIGIT ZERO~NINE
"๐๑๒๓๔๕๖๗๘๙"  THAI DIGIT ZERO~NINE
"໐໑໒໓໔໕໖໗໘໙"  LAO DIGIT ZERO~NINE
"༠༡༢༣༤༥༦༧༨༩"  TIBETAN DIGIT ZERO~NINE
"၀၁၂၃၄၅၆၇၈၉"  MYANMAR DIGIT ZERO~NINE
"០១២៣៤៥៦៧៨៩"  KHMER DIGIT ZERO~NINE
"0123456789"  FULLWIDTH DIGIT ZERO~NINE
"????????????????????????????????????????"  MATHEMATICAL BOLD DIGIT ZERO~NINE
"????????????????????????????????????????"  MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO~NINE
"????????????????????????????????????????"  MATHEMATICAL SANS-SERIF DIGIT ZERO~NINE
"????????????????????????????????????????"  MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO~NINE
"????????????????????????????????????????"  MATHEMATICAL MONOSPACE DIGIT ZERO~NINE

2。文字のいくつかの例isdecimal()==False but isdigit()==True

(したがってisnumeric()==True

"⁰¹²³⁴⁵⁶⁷⁸⁹"  SUPERSCRIPT ZERO~NINE
"₀₁₂₃₄₅₆₇₈₉"  SUBSCRIPT ZERO~NINE
"????⒈⒉⒊⒋⒌⒍⒎⒏⒐"  DIGIT ZERO~NINE FULL STOP
"????????????????????????????????????????"  DIGIT ZERO~NINE COMMA
"⓪①②③④⑤⑥⑦⑧⑨"  CIRCLED DIGIT ZERO~NINE
"⓿❶❷❸❹❺❻❼❽❾"  NEGATIVE CIRCLED DIGIT ZERO~NINE
"⑴⑵⑶⑷⑸⑹⑺⑻⑼"  PARENTHESIZED DIGIT ONE~NINE
"➀➁➂➃➄➅➆➇➈"  Dingbat CIRCLED SANS-SERIF DIGIT ONE~NINE
"⓵⓶⓷⓸⓹⓺⓻⓼⓽"  DOUBLE CIRCLED DIGIT ONE~NINE
"➊➋➌➍➎➏➐➑➒"  Dingbat NEGATIVE CIRCLED SANS-SERIF DIGIT ONE~NINE
"፩፪፫፬፭፮፯፰፱"  ETHIOPIC DIGIT ONE~NINE

isdecimal()==Falseおよびisdigit()==Falseの文字の一部の例、ただしisnumeric()==True

"½⅓¼⅕⅙⅐⅛⅑⅒⅔¾⅖⅗⅘⅚⅜⅝⅞⅟↉"  VULGAR FRACTION
"৴৵৶৷৸৹"  BENGALI CURRENCY NUMERATOR
"௰௱௲"  TAMIL NUMBER TEN, ONE HUNDRED, ONE THOUSAND
"౸౹౺౻౼౽౾"  TELUGU FRACTION DIGIT
"൰൱൲൳൴൵"  MALAYALAM NUMBER, MALAYALAM FRACTION
"༳༪༫༬༭༮༯༰༱༲"  TIBETAN DIGIT HALF ZERO~NINE
"፲፳፴፵፶፷፸፹፺፻፼"  ETHIOPIC NUMBER TEN~NINETY, HUNDRED, TEN THOUSAND
"៰៱៲៳៴៵៶៷៸៹"  KHMER SYMBOL LEK ATTAK
"ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯ"  ROMAN NUMERAL
"ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿ"  SMALL ROMAN NUMERAL
"ↀↁↂↅↆ"  ROMAN NUMERAL
"⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿"  CIRCLED NUMBER TEN~FIFTY
"㉈㉉㉊㉋㉌㉍㉎㉏"  CIRCLED NUMBER TEN~EIGHTY ON BLACK SQUARE
"⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇"  PARENTHESIZED NUMBER TEN~TWENTY
"⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛"  NUMBER TEN~TWENTY FULL STOP
"⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴"  NEGATIVE CIRCLED NUMBER ELEVEN
"⓾➉❿➓"  various styles of CIRCLED NUMBER TEN
"????"  Dingbat NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
"〇"  IDEOGRAPHIC NUMBER ZERO
"〡〢〣〤〥〦〧〨〩〸〹〺"  HANGZHOU NUMERAL ONE~TEN, TWENTY, THIRTY
"㆒㆓㆔㆕"  IDEOGRAPHIC ANNOTATION ONE~FOUR MARK
"㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩"  PARENTHESIZED IDEOGRAPH ONE~TEN
"㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉"  CIRCLED IDEOGRAPH ONE~TEN
"一二三四五六七八九十壹貳參肆伍陸柒捌玖拾零百千萬億兆弐貮贰㒃㭍漆什㐅陌阡佰仟万亿幺兩㠪亖卄卅卌廾廿"  CJK UNIFIED IDEOGRAPH
"參拾兩零六陸什"  CJK COMPATIBILITY IDEOGRAPH
"????????????????????????????????????????????????????????????????????????"  AEGEAN NUMBER ONE~NINE, TEN~NINETY
"????????????????????????????????????????????????????????????????????????"  AEGEAN NUMBER ONE~NINE HUNDRED, ONE~NINE THOUSAND
"????????????????????????????????"  AEGEAN NUMBER TEN~NINETY THOUSAND
"????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????"  GREEK ACROPHONIC ATTIC
"????????????????????????????????????"  COUNTING ROD UNIT DIGIT ONE~NINE
"????????????????????????????????????"  COUNTING ROD TENS DIGIT ONE~NINE
12
AnnieFromTaiwan

負の数a = "-10"は、これら3つすべてに対してfalseになります

a.isdecimal(), a.isdigit(), a.isnumeric()

false、False、False isdecimal()はどの言語でも0〜9しかありませんが、負の符号がない場合、isdigit()はどの言語でも0〜9だけで、「累乗」の位置になります。 (累乗の10進数、例:2の5乗)。 isnumeric()はさらに幅広いスペクトルです。また、任意の位置に0〜9を超える範囲が含まれますが、どの言語でも数十、数百、数千になります。 roman 10はXで、有効なisnumeric()です。しかし、3つすべてが偽です:負の数、例:-10および浮動小数点数、例:10.1

0
Sree