isdigit - isfloat python
¿Usar isdigit para flotadores? (7)
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? '')
Esto solo funciona si el usuario ingresa un integer
, pero quiero que funcione incluso si ingresa un float
, pero no cuando ingresa una string
.
Así que el usuario debería poder ingresar tanto 9
como 9.2
, pero no abc
.
¿Cómo debería hacerlo?
Creo que @ dan04 tiene el enfoque correcto (EAFP), pero desafortunadamente, el mundo real es a menudo un caso especial y realmente se necesita algún código adicional para gestionar las cosas. :
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))
Uso de la muestra:
> 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
EAFP
try:
x = float(a)
except ValueError:
print("You must enter a number")
Las respuestas existentes son correctas, ya que la forma más Pythonic suele ser try...except
(es decir, EAFP).
Sin embargo, si realmente desea hacer la validación, puede eliminar exactamente 1 punto decimal antes de usar 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
Tenga en cuenta que esto no trata a los flotadores de manera diferente a los ints. Puede agregar ese cheque si realmente lo necesita.
Sobre la base de la respuesta de dan04:
def isDigit(x):
try:
float(x)
return True
except ValueError:
return False
uso:
isDigit(3) # True
isDigit(3.1) # True
isDigit("3") # True
isDigit("3.1") # True
isDigit("hi") # False
Usa expresiones regulares.
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? '')
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
s = ''12.32''
if s.replace(''.'', '''').replace(''-'', '''').isdigit():
print(float(s))
Tenga en cuenta que esto también funcionará para los float
negativos.