2017-04-26 7 views
-5

Je voudrais vérifier si ma valeur est un float avec un point ou une virgule mais isdigit() retourne false avec un point. Je voudrais savoir pourquoi et comment le traverser.Pourquoi isdigit() retourne false sur float?

> value = "0.0" 
> print value.isdigit(): 
>>> False 

Mon code est:

if "." in value and value.isdigit() 
    print "ok" 
+7

Parce que '.' n'est pas un chiffre. 'isdigit()' ne renvoie que true pour les chaînes contenant ** seulement ** chiffres. –

+0

Cela ne peut être vrai à aucun moment, car une chose ne peut pas être avec l'autre. –

+0

mais "0.0" est un flotteur donc pour moi c'est un chiffre aussi ou est-ce différent? –

Répondre

4

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 
+0

Oui, utilisez toujours le nom d'exception pour intercepter l'exception correspondante dans le bloc sauf. +1 –