web-dev-qa-db-fra.com

Utiliser isdigit pour les flotteurs?

a = raw_input('How much is 1 share in that company? ')

while not a.isdigit():
    print("You need to write a number!\n")
    a = raw_input('How much is 1 share in that company? ')

Cela ne fonctionne que si l'utilisateur entre un integer, mais je veux que cela fonctionne même s'il entre un float, mais pas lorsqu'il entre un string.

L'utilisateur doit donc pouvoir saisir les deux 9 et 9.2, mais pas abc.

Comment dois-je procéder?

29
Peter Nolan

Utilisez des expressions régulières.

import re

p = re.compile('\d+(\.\d+)?')

a = raw_input('How much is 1 share in that company? ')

while p.match(a) == None:
    print "You need to write a number!\n"
    a = raw_input('How much is 1 share in that company? ')
12
Peter C

EAFP

try:
    x = float(a)
except ValueError:
    print("You must enter a number")
36
dan04

Les réponses existantes sont correctes dans la mesure où la manière la plus Pythonique est généralement de try...except (C'est-à-dire EAFP).

Cependant, si vous voulez vraiment faire la validation, vous pouvez supprimer exactement 1 point décimal avant d'utiliser isdigit().

>>> "124".replace(".", "", 1).isdigit()
True
>>> "12.4".replace(".", "", 1).isdigit()
True
>>> "12..4".replace(".", "", 1).isdigit()
False
>>> "192.168.1.1".replace(".", "", 1).isdigit()
False

Notez cependant que cela ne traite pas les flotteurs différemment des pouces. Vous pouvez cependant ajouter cette vérification si vous en avez vraiment besoin.

11
Cam Jackson

S'appuyant sur la réponse de dan04:

def isDigit(x):
    try:
        float(x)
        return True
    except ValueError:
        return False

usage:

isDigit(3)     # True
isDigit(3.1)   # True
isDigit("3")   # True
isDigit("3.1") # True
isDigit("hi")  # False
6
Phlox Midas
import re

string1 = "0.5"
string2 = "0.5a"
string3 = "a0.5"
string4 = "a0.5a"

p = re.compile(r'\d+(\.\d+)?$')

if p.match(string1):
    print(string1 + " float or int")
else:
    print(string1 + " not float or int")

if p.match(string2):
    print(string2 + " float or int")
else:
    print(string2 + " not float or int")

if p.match(string3):
    print(string3 + " float or int")
else:
    print(string3 + " not float or int")

if p.match(string4):
    print(string4 + " float or int")
else:
    print(string4 + " not float or int")

output:
0.5 float or int
0.5a not float or int
a0.5 not float or int
a0.5a not float or int
3

Je pense que @ dan04 a la bonne approche (EAFP), mais malheureusement le monde réel est souvent un cas spécial et un code supplémentaire est vraiment nécessaire pour gérer les choses - donc ci-dessous est un plus élaboré, mais aussi un peu plus pragmatique (et réaliste) :

import sys

while True:
    try:
        a = raw_input('How much is 1 share in that company? ')
        x = float(a)
        # validity check(s)
        if x < 0: raise ValueError('share price must be positive')
    except ValueError, e:
        print("ValueError: '{}'".format(e))
        print("Please try entering it again...")
    except KeyboardInterrupt:
        sys.exit("\n<terminated by user>")
    except:
        exc_value = sys.exc_info()[1]
        exc_class = exc_value.__class__.__name__
        print("{} exception: '{}'".format(exc_class, exc_value))
        sys.exit("<fatal error encountered>")
    else:
        break  # no exceptions occurred, terminate loop

print("Share price entered: {}".format(x))

Exemple d'utilisation:

> python numeric_input.py
How much is 1 share in that company? abc
ValueError: 'could not convert string to float: abc'
Please try entering it again...
How much is 1 share in that company? -1
ValueError: 'share price must be positive'
Please try entering it again...
How much is 1 share in that company? 9
Share price entered: 9.0

> python numeric_input.py
How much is 1 share in that company? 9.2
Share price entered: 9.2
3
martineau
s = '12.32'
if s.replace('.', '').replace('-', '').isdigit():
    print(float(s))

Notez que cela fonctionnera également pour les floats négatifs.

2
Jigyasu Tailor