How can I read inputs as numbers?
Solution
Since Python 3,input
returns a string which you have to explicitly convert to int
s, with int
, like thisx = int(input("Enter a number: "))
y = int(input("Enter a number: "))
You can accept numbers of any base and convert them directly to base-10 with the int
function, like this>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365
The second parameter tells what is the base of the numbers entered and then internally it understands and converts it. If the entered data is wrong it will throw a ValueError
.>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'
For values that can have a fractional component, the type would be float
rather than int
:x = float(input("Enter a number:"))
Differences between Python 2 and 3
Summary- Python 2's
input
function evaluated the received data, converting it to an integer implicitly (read the next section to understand the implication), but Python 3'sinput
function does not do that anymore. - Python 2's equivalent of Python 3's
input
is theraw_input
function.
There were two functions to get user input, called input
and raw_input
. The difference between them is, raw_input
doesn't evaluate the data and returns as it is, in string form. But, input
will evaluate whatever you entered and the result of evaluation will be returned. For example,
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
The data 5 + 17
is evaluated and the result is 22
. When it evaluates the expression 5 + 17
, it detects that you are adding two numbers and so the result will also be of the same int
type. So, the type conversion is done for free and 22
is returned as the result of input
and stored in data
variable. You can think of input
as the raw_input
composed with an eval
call.>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Note: you should be careful when you are using input
in Python 2.x. I explained why one should be careful when using it, in this answer.But, raw_input
doesn't evaluate the input and returns as it is, as a string.
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)
Python 3.xPython 3.x's input
and Python 2.x's raw_input
are similar and raw_input
is not available in Python 3.x.
>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)
Convert input str to int in python
By default, the input type is string
. To convert it into integer
, just put int
before input
. E.g.
number = int(input("Please guess what number I'm thinking of. HINT: it's between 1 and 30: "))
print(type(number))
Sample of the output:Please guess what number I'm thinking of. HINT: it's between 1 and 30: 30
<class 'int'> # it shows that the input type is integer
ALTERNATIVE# any input is string
number = input("Please guess what number I'm thinking of. HINT: it's between 1 and 30: ")
try: # if possible, try to convert the input into integer
number = int(number)
except: # if the input couldn't be converted into integer, then do nothing
pass
print(type(number)) # see the input type after processing
Sample of the output:Please guess what number I'm thinking of. HINT: it's between 1 and 30: 25 # the input is a number 25
<class 'int'> # 25 is possible to convert into integer. So, the type is integer
Please guess what number I'm thinking of. HINT: it's between 1 and 30: AAA # the input is a number AAA
<class 'str'> # AAA is impossible to convert into integer. So, the type remains string
How do I convert a string from an input into an integer? (Python 3.9)
You need to assign the value, because int()
doesn't apply on place.
number = int(number)
Python int() function
convert argv[1] to integer, without trusting the user input
Since you are stating that the user input cannot be trusted, I don't recommend using the function atoi
, for two reasons:
The behavior is undefined if the converted number is not representable as an
int
(i.e. if the number is out of range).The function will return
0
when the conversion failed. However, when this happens, you will not know whether the user actually entered0
or whether you got this value due to conversion failure.
strtol
instead of atoi
.In your question, you state that you want to reject the input if it contains any non-digit characters. One problem with the function strtol
is that it will skip any leading whitespace characters (e.g. space and tab characters) before attempting to convert a number. If you instead want to reject the input if it contains any leading whitespace characters, then you will have to compare each character with isdigit
, before using the function strtol
. Doing this will also solve the problem of invalid characters after the number, so that input such as 123abc
will get rejected.
Here is a program which will attempt to convert argv[1]
to an integer, while performing full input validation:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
int main( int argc, char *argv[] )
{
long num;
char *p;
//verify that argv[1] is valid
if ( argc < 2 )
{
printf( "not enough parameters!\n" );
exit( EXIT_FAILURE );
}
//verify that argv[1] consists only of digits
for ( p = argv[1]; *p != '\0'; p++ )
{
if ( !isdigit( (unsigned char)*p ) )
{
printf( "first program argument must consist only of digits!\n" );
exit( EXIT_FAILURE );
}
}
//attempt to convert argv[1] to integer
errno = 0;
num = strtol( argv[1], &p, 10 );
//verify that conversion was successful
if ( p == argv[1] )
{
printf( "unable to convert to integer\n" );
exit( EXIT_FAILURE );
}
//verify that no range error occurred
if ( errno == ERANGE )
{
printf( "input is out of range\n" );
exit( EXIT_FAILURE );
}
//everything is ok, so print the result
printf( "The result is: %ld\n", num );
return 0;
}
Related Topics
Using Facebook Connect with Authlogic
How to (Massively) Reduce The Number of SQL Queries in Rails App
How to Reference a Local Gem from a Ruby Script
Using Multiple Yields to Insert Content
Inspect or Clean Up The Working Tree Error When Installing Ruby 2.1.3 on MAC Os X 10.9.5
Will_Paginate Find Out If I'M on The Last Page
Actionmailer Pass Local Variables to The Erb Template
How to Make Two Thor Tasks Share Options
Rails + Mongoid - Don't Return Nil Values in JSON
Segmentation Fault with Ruby 1.8.7
Converting Escaped Xml Entities Back into Utf-8
After_Save Callback to Set The Updated_By Column to The Current_User
How to Reverse a Linked List in Ruby
How to Get Content from a Website Using Ruby/Rails