Ejemplo de diferencia de str.isdecimal () y str.isdigit ()

Al leer documentos de Python, he llegado a las funciones de cadena .isdecimal () y .isdigit () y no encuentro la literatura demasiado clara sobre su distinción utilizable. ¿Podría alguien proporcionarme ejemplos de código de dónde estas dos funciones se diferencian, por favor?

Comportamiento similar

>>> str.isdecimal('1') True >>> str.isdigit('1') True >>> str.isdecimal('1.0') False >>> str.isdigit('1.0') False >>> str.isdecimal('1/2') False >>> str.isdigit('1/2') False 

Hay diferencias, pero son algo raras * . Principalmente surge con varios caracteres Unicode, como 2 :

 >>> c = '\u00B2' >>> c.isdecimal() False >>> c.isdigit() True 

También puede ir más abajo en el agujero de conejo de distinción Unicode cuidadosa con el método isnumeric :

 >>> c = '\u00BD' # ½ >>> c.isdecimal() False >>> c.isdigit() False >>> c.isnumeric() True 

* Al menos, nunca he encontrado un código de producción que deba distinguir entre cadenas que contienen diferentes tipos de estas situaciones excepcionales, pero seguramente existen casos de uso en algún lugar.

Veamos algunos ejemplos:

str.isdecimal () (solo números decimales)

¿Es 34 un número decimal? -> si

 print("34".isdecimal()) #True 

¿Es superíndice 2 un número decimal? -> No

 print("\u00B2") print("\u00B2".isdecimal()) #False 

str.isdigit () ( decimales, subíndices , superíndices)

¿Es 34 un dígito? -> si

 print("34".isdigit()) #True 

¿Es superíndice 2 un dígito? -> si

 print("\u00B2") print("\u00B2".isdigit()) #True 

str.isnumeric () (dígitos, fracciones vulgares, subíndices, superíndices, números romanos, numeradores de moneda)

¿Es 34 un número numérico? -> si

 print("34".isnumeric()) #True 

¿Es superíndice 2 un número numérico? -> si

 print("\u00B2") print("\u00B2".isnumeric()) #True 

¿Es Vulgar Fraction un número numérico de cuarto? -> si

 print("\u00BC") print("\u00BC".isnumeric()) #True 

Si tiene alguna duda, mi consejo: codificar, buscar resultados, sacar conclusiones.

Un codigo

 In [115]: import itertools ...: ...: line = '-' * 37 ...: print(line) ...: print("| № | isdigit | isdecimal | chr") ...: print(line) ...: for number in itertools.chain(range(1000), range(4969, 4978), range(8304, 11000)): ...: char = chr(number) ...: if (char.isdigit() or char.isdecimal()): ...: print('| {0:>6} | {1:^7} | {2:^9} | {3:3} '.format( ...: number, ...: '+' if char.isdigit() else '-', ...: '+' if char.isdecimal() else '-', ...: char ...: ) ...: ) ...: 

Mira un resultado

 ------------------------------------- | № | isdigit | isdecimal | chr ------------------------------------- | 48 | + | + | 0 | 49 | + | + | 1 | 50 | + | + | 2 | 51 | + | + | 3 | 52 | + | + | 4 | 53 | + | + | 5 | 54 | + | + | 6 | 55 | + | + | 7 | 56 | + | + | 8 | 57 | + | + | 9 | 178 | + | - | ² | 179 | + | - | ³ | 185 | + | - | ¹ | 4969 | + | - | ፩ | 4970 | + | - | ፪ | 4971 | + | - | ፫ | 4972 | + | - | ፬ | 4973 | + | - | ፭ | 4974 | + | - | ፮ | 4975 | + | - | ፯ | 4976 | + | - | ፰ | 4977 | + | - | ፱ | 8304 | + | - | ⁰ | 8308 | + | - | ⁴ | 8309 | + | - | ⁵ | 8310 | + | - | ⁶ | 8311 | + | - | ⁷ | 8312 | + | - | ⁸ | 8313 | + | - | ⁹ | 8320 | + | - | ₀ | 8321 | + | - | ₁ | 8322 | + | - | ₂ | 8323 | + | - | ₃ | 8324 | + | - | ₄ | 8325 | + | - | ₅ | 8326 | + | - | ₆ | 8327 | + | - | ₇ | 8328 | + | - | ₈ | 8329 | + | - | ₉ | 9312 | + | - | ① | 9313 | + | - | ② | 9314 | + | - | ③ | 9315 | + | - | ④ | 9316 | + | - | ⑤ | 9317 | + | - | ⑥ | 9318 | + | - | ⑦ | 9319 | + | - | ⑧ | 9320 | + | - | ⑨ | 9332 | + | - | ⑴ | 9333 | + | - | ⑵ | 9334 | + | - | ⑶ | 9335 | + | - | ⑷ | 9336 | + | - | ⑸ | 9337 | + | - | ⑹ | 9338 | + | - | ⑺ | 9339 | + | - | ⑻ | 9340 | + | - | ⑼ | 9352 | + | - | ⒈ | 9353 | + | - | ⒉ | 9354 | + | - | ⒊ | 9355 | + | - | ⒋ | 9356 | + | - | ⒌ | 9357 | + | - | ⒍ | 9358 | + | - | ⒎ | 9359 | + | - | ⒏ | 9360 | + | - | ⒐ | 9450 | + | - | ⓪ | 9461 | + | - | ⓵ | 9462 | + | - | ⓶ | 9463 | + | - | ⓷ | 9464 | + | - | ⓸ | 9465 | + | - | ⓹ | 9466 | + | - | ⓺ | 9467 | + | - | ⓻ | 9468 | + | - | ⓼ | 9469 | + | - | ⓽ | 9471 | + | - | ⓿ | 10102 | + | - | ❶ | 10103 | + | - | ❷ | 10104 | + | - | ❸ | 10105 | + | - | ❹ | 10106 | + | - | ❺ | 10107 | + | - | ❻ | 10108 | + | - | ❼ | 10109 | + | - | ❽ | 10110 | + | - | ❾ | 10112 | + | - | ➀ | 10113 | + | - | ➁ | 10114 | + | - | ➂ | 10115 | + | - | ➃ | 10116 | + | - | ➄ | 10117 | + | - | ➅ | 10118 | + | - | ➆ | 10119 | + | - | ➇ | 10120 | + | - | ➈ | 10122 | + | - | ➊ | 10123 | + | - | ➋ | 10124 | + | - | ➌ | 10125 | + | - | ➍ | 10126 | + | - | ➎ | 10127 | + | - | ➏ | 10128 | + | - | ➐ | 10129 | + | - | ➑ | 10130 | + | - | ➒ 

Sacar conclusiones

Como puede ver, la principal diferencia entre la función str.isdecimal () y str.isdigit () es que: la función str.isdecimal () devuelve True solo para los números del 0 al 9, al mismo tiempo que la función str.isdigit () devuelve True para algunos otros caracteres compatibles con Unicode.