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?
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? ')
EAFP
try:
x = float(a)
except ValueError:
print("You must enter a number")
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.
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
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
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
s = '12.32'
if s.replace('.', '').replace('-', '').isdigit():
print(float(s))
Notez que cela fonctionnera également pour les float
s négatifs.