str.isdigit()
ne retourneront vrai si tous les caractères de la chaîne sont chiffres. .
est la ponctuation, pas un chiffre.
De l'python 3 str.isdigit()
documentation:
Formellement, un chiffre est un caractère qui a la valeur de la propriété Numeric_Type = chiffre ou Numeric_Type = Decimal
(pour python 2, pour str
objets seuls les chiffres ASCII (0
à 9
) sont pris en compte, mais pour les objets unicode
la même définition s'applique).
Voir le official Numeric Property definitions specification; il y a 708 Unicode codepoints qui correspondent à cette description.
aux catégories ce Simplifier unicode général, les types numériques en Unicode ont une catégorie commençant par N
, mais .
ne possède pas:
>>> import unicodedata
>>> unicodedata.category(u'.')
'Po'
P
représente ponctuation ici, o
pour autres.
vice-versa, les chaînes qui ne contiennent que des chiffres ne sont pas toujours convertable à un flotteur ou le numéro soit:
>>> unicodedata.name(u'\u2080')
'SUBSCRIPT ZERO'
>>> unicodedata.category(u'\u2080')
'No'
>>> unicodedata.digit(u'\u2080')
0
>>> u'\u2080'.isdigit()
True
>>> float(u'\u2080')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'decimal' codec can't encode character u'\u2080' in position 0: invalid decimal Unicode string
Ainsi, un indice zéro est pas vraiment 0 dans la mesure où float()
est concerné, mais il est un chiffre.
Si vous voulez tester si une chaîne est un nombre à virgule flottante valide, utilisez float
et attraper le ValueError
:
def is_float(string):
try:
float(string)
return True
except ValueError:
return False
Parce que '.' n'est pas un chiffre. 'isdigit()' ne renvoie que true pour les chaînes contenant ** seulement ** chiffres. –
Cela ne peut être vrai à aucun moment, car une chose ne peut pas être avec l'autre. –
mais "0.0" est un flotteur donc pour moi c'est un chiffre aussi ou est-ce différent? –