1. À propos de isdecimal(), isdigit() et isnumeric() en Python
Python propose les méthodes isdecimal(), isdigit() et isnumeric() pour tester le contenu numérique d'une chaîne de caractères. Elles semblent très proches, mais elles n'acceptent pas exactement les mêmes caractères Unicode.
Ces trois méthodes retournent un booléen. Avec les chiffres décimaux ordinaires de 0 à 9, elles retournent toutes True.
1 2 3 4 | texte = "2026" print("isdecimal() :", texte.isdecimal()) print("isdigit() :", texte.isdigit()) print("isnumeric() :", texte.isnumeric()) |
Sortie :
1 2 3 | isdecimal() : True isdigit() : True isnumeric() : True |
La différence apparaît avec certains caractères Unicode. Par exemple, le caractère exposant "²" est accepté par isdigit() et isnumeric(), mais pas par isdecimal().
1 2 3 4 | texte = "²" print("isdecimal() :", texte.isdecimal()) print("isdigit() :", texte.isdigit()) print("isnumeric() :", texte.isnumeric()) |
Sortie :
1 2 3 | isdecimal() : False isdigit() : True isnumeric() : True |
Avec une fraction Unicode comme "⅕", seule isnumeric() retourne True.
1 2 3 4 | texte = "⅕" print("isdecimal() :", texte.isdecimal()) print("isdigit() :", texte.isdigit()) print("isnumeric() :", texte.isnumeric()) |
Sortie :
1 2 3 | isdecimal() : False isdigit() : False isnumeric() : True |
On peut donc retenir une relation générale importante : isdecimal() est la plus restrictive, isdigit() accepte davantage de caractères et isnumeric() est la plus large des trois.
2. Comprendre la méthode isdecimal()
La méthode isdecimal() retourne True lorsque la chaîne n'est pas vide et que tous ses caractères sont des caractères décimaux Unicode. Les chiffres classiques de 0 à 9 appartiennent à cette catégorie.
Dans l'exemple suivant, tous les caractères sont des chiffres décimaux.
1 2 | texte = "123456" print(texte.isdecimal()) |
Sortie :
1 | True |
isdecimal() reconnaît également d'autres caractères décimaux Unicode, notamment les chiffres arabes orientaux utilisés dans l'exemple suivant.
1 2 | texte = "١٢٣" print(texte.isdecimal()) |
Sortie :
1 | True |
En revanche, un chiffre écrit en exposant n'appartient pas à la catégorie des caractères décimaux acceptés par isdecimal().
1 2 | texte = "²" print(texte.isdecimal()) |
Sortie :
1 | False |
La présence d'un signe, d'un espace ou d'un séparateur décimal entraîne également le retour de False.
1 2 3 | print("-25".isdecimal()) print("12.5".isdecimal()) print("12 34".isdecimal()) |
Sortie :
1 2 3 | False False False |
3. Comprendre la méthode isdigit()
La méthode isdigit() est un peu moins restrictive que isdecimal(). Elle accepte les caractères décimaux reconnus par isdecimal(), mais aussi certains autres caractères Unicode considérés comme des chiffres.
Avec les chiffres ordinaires, isdigit() retourne naturellement True.
1 2 | texte = "2026" print(texte.isdigit()) |
Sortie :
1 | True |
La différence avec isdecimal() apparaît notamment avec certains chiffres en exposant. Le caractère "²" retourne True avec isdigit().
1 2 3 | texte = "²" print("isdecimal() :", texte.isdecimal()) print("isdigit() :", texte.isdigit()) |
Sortie :
1 2 | isdecimal() : False isdigit() : True |
Une fraction Unicode comme "⅕" n'est cependant pas considérée comme un chiffre par isdigit().
1 2 | texte = "⅕" print(texte.isdigit()) |
Sortie :
1 | False |
Comme isdecimal(), isdigit() retourne False pour les représentations textuelles de nombres contenant un signe ou un point décimal.
1 2 3 | print("-100".isdigit()) print("+100".isdigit()) print("3.14".isdigit()) |
Sortie :
1 2 3 | False False False |
4. Comprendre la méthode isnumeric()
La méthode isnumeric() est la plus large des trois méthodes. Elle retourne True pour les caractères décimaux, les caractères reconnus comme chiffres par isdigit(), ainsi que pour certains autres caractères Unicode possédant une valeur numérique.
Les chiffres ordinaires sont bien entendu reconnus par isnumeric().
1 2 | texte = "123" print(texte.isnumeric()) |
Sortie :
1 | True |
Le caractère exposant "²" possède également une propriété numérique reconnue par isnumeric().
1 2 | texte = "²" print(texte.isnumeric()) |
Sortie :
1 | True |
Contrairement à isdigit(), isnumeric() reconnaît aussi certaines fractions Unicode, comme "⅕".
1 2 3 | texte = "⅕" print("isdigit() :", texte.isdigit()) print("isnumeric() :", texte.isnumeric()) |
Sortie :
1 2 | isdigit() : False isnumeric() : True |
Certains caractères numériques provenant d'autres systèmes d'écriture sont également reconnus. Le caractère chinois "四", qui représente le nombre quatre, est par exemple numérique pour isnumeric().
1 2 3 4 | texte = "四" print("isdecimal() :", texte.isdecimal()) print("isdigit() :", texte.isdigit()) print("isnumeric() :", texte.isnumeric()) |
Sortie :
1 2 3 | isdecimal() : False isdigit() : False isnumeric() : True |
5. Comparer isdecimal(), isdigit() et isnumeric()
La différence entre les trois méthodes peut être comprise comme un élargissement progressif des caractères acceptés : isdecimal() est la plus restrictive, isdigit() est plus large et isnumeric() est la plus générale.
Le programme suivant compare les trois méthodes avec plusieurs caractères représentatifs.
1 2 3 | valeurs = ["123", "١٢٣", "²", "⅕", "四"] for valeur in valeurs: print(repr(valeur), valeur.isdecimal(), valeur.isdigit(), valeur.isnumeric()) |
Sortie :
1 2 3 4 5 | '123' True True True '١٢٣' True True True '²' False True True '⅕' False False True '四' False False True |
Relation entre les trois méthodes
Pour une chaîne non vide, lorsqu'un caractère est accepté par isdecimal(), il est également accepté par isdigit() et isnumeric(). De même, les caractères acceptés par isdigit() sont également numériques au sens de isnumeric(). On peut donc retenir l'inclusion suivante : isdecimal() → isdigit() → isnumeric().
L'exemple suivant illustre cette progression avec trois caractères appartenant à des catégories différentes.
1 2 | for texte in ["5", "²", "⅕"]: print(texte, ":", texte.isdecimal(), texte.isdigit(), texte.isnumeric()) |
Sortie :
1 2 3 | 5 : True True True ² : False True True ⅕ : False False True |
Les nombres négatifs et décimaux
Ces méthodes examinent les caractères de la chaîne et non la validité globale d'un nombre écrit sous forme de texte. Un signe "-" ou un point "." n'est pas un caractère numérique accepté par ces méthodes.
1 2 3 | valeurs = ["-25", "+25", "12.5"] for valeur in valeurs: print(valeur, valeur.isdecimal(), valeur.isdigit(), valeur.isnumeric()) |
Sortie :
1 2 3 | -25 False False False +25 False False False 12.5 False False False |
Le cas de la chaîne vide
Pour retourner True, chacune de ces méthodes exige au moins un caractère valide. Une chaîne vide retourne donc False dans les trois cas.
1 2 3 4 | texte = "" print(texte.isdecimal()) print(texte.isdigit()) print(texte.isnumeric()) |
Sortie :
1 2 3 | False False False |
Attention à la conversion avec int()
Un résultat True avec isdigit() ou isnumeric() ne signifie pas nécessairement que la chaîne peut être directement convertie avec int(). Par exemple, "²" satisfait isdigit() mais int() ne l'accepte pas directement.
1 2 3 4 5 6 7 | texte = "²" print("isdigit() :", texte.isdigit()) try: nombre = int(texte) print(nombre) except ValueError: print("Conversion avec int() impossible") |
Sortie :
1 2 | isdigit() : True Conversion avec int() impossible |
Quel test choisir ?
Le choix dépend du type de caractères que le programme doit accepter. isdecimal() convient lorsqu'on souhaite restreindre le test aux caractères décimaux Unicode. isdigit() accepte en plus certains caractères représentant des chiffres, tandis que isnumeric() convient lorsque l'on souhaite reconnaître un ensemble plus large de caractères Unicode possédant une valeur numérique.
Le programme suivant permet de constater qu'un même caractère peut être accepté par une méthode et refusé par une autre.
1 2 3 4 5 6 | decimal = "5" chiffre = "²" numerique = "⅕" print("5 :", decimal.isdecimal(), decimal.isdigit(), decimal.isnumeric()) print("² :", chiffre.isdecimal(), chiffre.isdigit(), chiffre.isnumeric()) print("⅕ :", numerique.isdecimal(), numerique.isdigit(), numerique.isnumeric()) |
Sortie :
1 2 3 | 5 : True True True ² : False True True ⅕ : False False True |
6. À retenir !
Les méthodes isdecimal(), isdigit() et isnumeric() permettent toutes de tester des caractères numériques, mais elles ne couvrent pas exactement le même ensemble de caractères Unicode.
- isdecimal() est la plus restrictive des trois méthodes.
- isdigit() accepte les caractères décimaux ainsi que certains autres caractères considérés comme des chiffres.
- isnumeric() est la plus large et accepte certains caractères numériques supplémentaires, notamment des fractions et d'autres caractères Unicode possédant une valeur numérique.
- La chaîne "123" retourne True avec les trois méthodes.
- Le caractère "²" retourne False avec isdecimal(), mais True avec isdigit() et isnumeric().
- Le caractère "⅕" retourne False avec isdecimal() et isdigit(), mais True avec isnumeric().
- Une chaîne vide retourne False avec les trois méthodes.
- Les signes "+" et "-" ne sont acceptés par aucune des trois méthodes.
- Le point d'un nombre comme "12.5" provoque également le retour de False avec les trois méthodes.
- Un résultat True avec isdigit() ou isnumeric() ne garantit pas que int() puisse convertir directement la chaîne.
Le programme suivant résume les principales différences entre les trois méthodes.
1 2 3 | valeurs = ["123", "²", "⅕", "12.5", "-25", ""] for valeur in valeurs: print(repr(valeur), ":", valeur.isdecimal(), valeur.isdigit(), valeur.isnumeric()) |
Sortie :
1 2 3 4 5 6 | '123' : True True True '²' : False True True '⅕' : False False True '12.5' : False False False '-25' : False False False '' : False False False |
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/



