matteo_c
Cuando ejecuto estos métodos
s.isdigit()
s.isnumeric()
s.isdecimal()
Siempre me dieron como salida o todo True
o todo False
por cada valor de s
(que por supuesto es una cadena). ¿Cuál es la diferencia entre los tres? ¿Puede dar un ejemplo que dé dos True
s y uno False
(o viceversa)?
AnnieDeTaiwán
Por definición, isdecimal()
⊆ isdigit()
⊆ isnumeric()
. Es decir, si una cadena es decimal
entonces también será digit
y numeric
.
Por lo tanto, dada una cadena s
y pruébelo con esos tres métodos, solo habrá 4 tipos de resultados.
+-------------+-----------+-------------+----------------------------------+
| isdecimal() | isdigit() | isnumeric() | Example |
+-------------+-----------+-------------+----------------------------------+
| True | True | True | "038", "੦੩੮", "038" |
| False | True | True | "⁰³⁸", "🄀⒊⒏", "⓪③⑧" |
| False | False | True | "↉⅛⅘", "ⅠⅢⅧ", "⑩⑬㊿", "壹貳參" |
| False | False | False | "abc", "38.0", "-38" |
+-------------+-----------+-------------+----------------------------------+
1. Algunos ejemplos de personajes isdecimal()==True
(de este modo isdigit()==True
y 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. Algunos ejemplos de personajes isdecimal()==False
pero isdigit()==True
(de este modo 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
3. Algunos ejemplos de personajes isdecimal()==False
y isdigit()==False
pero 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
-
"🄀⒊⒏"
realmente me confundió, ya que pensé que era solo"0.3.8."
. Solo después de copiar y pegar en el REPL me di cuenta de que son caracteres Unicode.–Jethro Cao
9 de marzo de 2020 a las 5:48
-
Tu mesa no tiene sentido. Fila 1: ¿llamas a cada función 1 vez para “038”? ¿O llama a cada función 3 veces – para ` “038”, “੦੩੮”, “038” ` y cada función devuelve el mismo resultado para todos los ` “038”, “੦੩੮”, “038” `?
– parsécer
12 de noviembre de 2020 a las 21:24
-
Ambos caminos funcionan. Te recomiendo que los pruebes tú mismo.
– Annie de Taiwán
13 de noviembre de 2020 a las 6:10
-
¿Hay una función como
all(c in "0123456789" for c in s)
?– xjcl
26 de febrero a las 2:35
ingenio
Se trata principalmente de clasificaciones Unicode. He aquí algunos ejemplos para mostrar las discrepancias:
>>> 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
El comportamiento específico está en los documentos oficiales. aquí.
Script para encontrarlos todos:
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
try:
name = unicodedata.name(s)
except ValueError:
name = f'codepoint{i}'
print(s, name)
d
-
Gracias. ¿Dónde puedo encontrar documentación que explique cómo funcionan? No he encontrado nada detallado en el oficial.
– matteo_c
3 de julio de 2017 a las 17:35
decano cristiano
La documentación de Python señala la diferencia entre los tres métodos.
str.isdigit
Devuelve verdadero si todos los caracteres de la cadena son dígitos y hay al menos un carácter; de lo contrario, devuelve falso. Los dígitos incluyen caracteres decimales y dígitos que necesitan un tratamiento especial, como los dígitos en superíndice de compatibilidad. Esto cubre dígitos que no se pueden usar para formar números en base 10, como los números de Kharosthi. Formalmente, un dígito es un carácter que tiene el valor de propiedad Numeric_Type=Digit o Numeric_Type=Decimal.
str.isnumeric
Devuelve verdadero si todos los caracteres de la cadena son caracteres numéricos y hay al menos un carácter; de lo contrario, devuelve falso. Los caracteres numéricos incluyen caracteres de dígitos y todos los caracteres que tienen la propiedad de valor numérico Unicode, por ejemplo, U+2155, FRACCIÓN VULGAR UN QUINTO. Formalmente, los caracteres numéricos son aquellos que tienen el valor de propiedad Numeric_Type=Digit, Numeric_Type=Decimal o Numeric_Type=Numeric.
str.isdecimal
Devuelve verdadero si todos los caracteres de la cadena son caracteres decimales y hay al menos un carácter; de lo contrario, devuelve falso. Los caracteres decimales son aquellos que se pueden utilizar para formar números en base 10, por ejemplo, U+0660, DÍGITO ÁRABE-INDICO CERO. Formalmente, un carácter decimal es un carácter en la categoría general Unicode “Nd”.
Como dijo @Wim, la principal diferencia entre los tres métodos es la forma en que manejan caracteres Unicode específicos.
-
Estas son algunas de las partes menos útiles y más engañosas de la API de Python. Realmente necesitamos un
isfloat
y los mal nombradosisdecimal
yisnumeric
son fáciles de confundir con estos.– Zephaniah Grunschlag
29 de agosto de 2021 a las 16:44
-
Buena respuesta, pero habría ayudado un poco en la lectura si los enumerara en orden lógico: isdecimal – isdigit – isnumeric
– NeilG
9 de noviembre de 2021 a las 21:41
un numero negativo a = "-10"
sería falso para todos estos tres
a.isdecimal(), a.isdigit(), a.isnumeric()
son Falso, Falso, Falso isdecimal() tendrá solo del 0 al 9 en cualquier idioma, pero sin signos negativos isdigit() tendrá solo del 0 al 9 en cualquier idioma, también en las posiciones “a la potencia de”. (números decimales en potencia, ej: 2 elevado a 5). isnumeric() es un espectro aún más amplio… también incluirá más de 0 a 9 en cualquier posición, pero también tendrá decenas, centenas, miles en cualquier idioma, ej. roman 10 es X, es un isnumeric() válido. Pero los tres son falsos para: Números negativos, ej: -10 y números de coma flotante, ej: 10.1