isfloat isdigit isalnum español python parsing user-input

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.