I also ran into problems this morning with users being able to enter non-integer responses to my specific request for an integer.
This was the solution that ended up working well for me to force an answer I wanted:
player_number = 0
while player_number != 1 and player_number !=2:
player_number = raw_input("Are you Player 1 or 2? ")
try:
player_number = int(player_number)
except ValueError:
print "Please enter '1' or '2'..."
I would get exceptions before even reaching the try: statement when I used
player_number = int(raw_input("Are you Player 1 or 2? ")
and the user entered "J" or any other non-integer character. It worked out best to take it as raw input, check to see if that raw input could be converted to an integer, and then convert it afterward.
This solution will accept only integers and nothing but integers.
def is_number(s):
while s.isdigit() == False:
s = raw_input("Enter only numbers: ")
return int(s)
# Your program starts here
user_input = is_number(raw_input("Enter a number: "))
If you specifically need an int or float, you could try "is not int" or "is not float":
user_input = ''
while user_input is not int:
try:
user_input = int(input('Enter a number: '))
break
except ValueError:
print('Please enter a valid number: ')
print('You entered {}'.format(a))
If you only need to work with ints, then the most elegant solution I've seen is the ".isdigit()" method:
a = ''
while a.isdigit() == False:
a = input('Enter a number: ')
print('You entered {}'.format(a))
I would recommend this, @karthik27, for negative numbers
import re
num_format = re.compile(r'^\-?[1-9][0-9]*\.?[0-9]*')
Then do whatever you want with that regular expression, match(), findall() etc
Based on inspiration from answer. I defined a function as below. Looks like its working fine. Please let me know if you find any issue
def isanumber(inp):
try:
val = int(inp)
return True
except ValueError:
try:
val = float(inp)
return True
except ValueError:
return False
I've been using a different approach I thought I'd share. Start with creating a valid range:
valid = [str(i) for i in range(-10,11)] # ["-10","-9...."10"]
Now ask for a number and if not in list continue asking:
p = input("Enter a number: ")
while p not in valid:
p = input("Not valid. Try to enter a number again: ")
Lastly convert to int (which will work because list only contains integers as strings:
p = int(p)
while True:
b1=input('Type a number:')
try:
a1=int(b1)
except ValueError:
print ('"%(a1)s" is not a number. Try again.' %{'a1':b1})
else:
print ('You typed "{}".'.format(a1))
break
This makes a loop to check whether input is an integer or not, result would look like below:
>>> %Run 1.1.py
Type a number:d
"d" is not a number. Try again.
Type a number:
>>> %Run 1.1.py
Type a number:4
You typed 4.
>>>
For Python 3 the following will work.
userInput = 0
while True:
try:
userInput = int(input("Enter something: "))
except ValueError:
print("Not an integer!")
continue
else:
print("Yes an integer!")
break
I know this is pretty late but its to help anyone else that had to spend 6 hours trying to figure this out. (thats what I did):
This works flawlessly: (checks if any letter is in the input/checks if input is either integer or float)
a=(raw_input("Amount:"))
try:
int(a)
except ValueError:
try:
float(a)
except ValueError:
print "This is not a number"
a=0
if a==0:
a=0
else:
print a
#Do stuff
Here is the simplest solution:
a= input("Choose the option\n")
if(int(a)):
print (a);
else:
print("Try Again")
You can use the isdigit() method for strings. In this case, as you said the input is always a string:
user_input = input("Enter something:")
if user_input.isdigit():
print("Is a number")
else:
print("Not a number")
The method isnumeric()
will do the job (Documentation for python3.x):
>>>a = '123'
>>>a.isnumeric()
True
But remember:
>>>a = '-1'
>>>a.isnumeric()
False
isnumeric()
returns True if all characters in the string are numeric characters, and there is at least one character.
So negative numbers are not accepted.
This works with any number, including a fraction:
import fractions
def isnumber(s):
try:
float(s)
return True
except ValueError:
try:
Fraction(s)
return True
except ValueError:
return False
Works fine for check if an input is a positive Integer AND in a specific range
def checkIntValue():
'''Works fine for check if an **input** is
a positive Integer AND in a specific range'''
maxValue = 20
while True:
try:
intTarget = int(input('Your number ?'))
except ValueError:
continue
else:
if intTarget < 1 or intTarget > maxValue:
continue
else:
return (intTarget)
natural: [0, 1, 2 ... 8]
Python 2
it_is = unicode(user_input).isnumeric()
Python 3
it_is = str(user_input).isnumeric()
integer: [-8, .., -2, -1, 0, 1, 2, 8]
try:
int(user_input)
it_is = True
except ValueError:
it_is = False
float: [-8, .., -2, -1.0...1, -1, -0.0...1, 0, 0.0...1, ..., 1, 1.0...1, ..., 8]
try:
float(user_input)
it_is = True
except ValueError:
it_is = False
a=10
isinstance(a,int) #True
b='abc'
isinstance(b,int) #False
the most elegant solutions would be the already proposed,
a=123
bool_a = a.isnumeric()
Unfortunatelly it doesn't work both for negative integers and for general float values of a. If your point is to check if 'a' is a generic number beyond integers i'd suggest the following one, which works for every kind of float and integer :). Here is the test:
def isanumber(a):
try:
float(repr(a))
bool_a = True
except:
bool_a = False
return bool_a
a = 1 # integer
isanumber(a)
>>> True
a = -2.5982347892 # general float
isanumber(a)
>>> True
a = '1' # actually a string
isanumber(a)
>>> False
I hope you find it useful :)
Here is a simple function that checks input for INT and RANGE. Here, returns 'True' if input is integer between 1-100, 'False' otherwise
def validate(userInput):
try:
val = int(userInput)
if val > 0 and val < 101:
valid = True
else:
valid = False
except Exception:
valid = False
return valid
EDITED: You could also use this below code to find out if its a number or also a negative
import re
num_format = re.compile("^[\-]?[1-9][0-9]*\.?[0-9]+$")
isnumber = re.match(num_format,givennumber)
if isnumber:
print "given string is number"
you could also change your format to your specific requirement. I am seeing this post a little too late.but hope this helps other persons who are looking for answers :) . let me know if anythings wrong in the given code.
try this! it worked for me even if I input negative numbers.
def length(s):
return len(s)
s = input("Enter the String: ")
try:
if (type(int(s)))==int :
print("You input an integer")
except ValueError:
print("it is a string with length " + str(length(s)))
Apparently this will not work for negative values, but it will for positive numbers.
Use isdigit()
if userinput.isdigit():
#do stuff
If you wanted to evaluate floats, and you wanted to accept NaN
s as input but not other strings like 'abc'
, you could do the following:
def isnumber(x):
import numpy
try:
return type(numpy.float(x)) == float
except ValueError:
return False
Why not divide the input by a number? This way works with everything. Negatives, floats, and negative floats. Also Blank spaces and zero.
numList = [499, -486, 0.1255468, -0.21554, 'a', "this", "long string here", "455 street area", 0, ""]
for item in numList:
try:
print (item / 2) #You can divide by any number really, except zero
except:
print "Not A Number: " + item
Result:
249
-243
0.0627734
-0.10777
Not A Number: a
Not A Number: this
Not A Number: long string here
Not A Number: 455 street area
0
Not A Number:
Source: Stackoverflow.com