By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,772 Members | 919 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,772 IT Pros & Developers. It's quick & easy.

Best way to check if string is an integer?

P: n/a
which is the best way to check if a string is an number or a char?
could the 2nd example be very expensive timewise if i have to check a
lot of strings?

this

value = raw_input()

try:
value = int(value)
except ValueError:
print "value is not an integer"
or:
c=raw_input("yo: ")
if c in '0123456789':
print "integer"
else:
print "char"

or some other way?
Apr 5 '08 #1
Share this Question
Share on Google+
16 Replies


P: n/a
sk*******@yahoo.se wrote:
>which is the best way to check if a string is an number or a char?
could the 2nd example be very expensive timewise if i have to check a
lot of strings?

this

value = raw_input()

try:
value = int(value)
except ValueError:
print "value is not an integer"
or:
c=raw_input("yo: ")
if c in '0123456789':
print "integer"
else:
print "char"

or some other way?

I always do it the first way. It is simpler, and should be faster. Also,
the second way will only work on single-digit numbers (you would have to
iterate over the entire string with a for loop to use it on numbers with
more than one digit).
Apr 5 '08 #2

P: n/a
On Apr 5, 6:19*pm, skanem...@yahoo.se wrote:
which is the best way to check if a string is an number or a char?
could the 2nd example be very expensive timewise if i have to check a
lot of strings?
You might be interested in str.isdigit:
>>print str.isdigit.__doc__
S.isdigit() -bool

Return True if all characters in S are digits
and there is at least one character in S, False otherwise.

Mark
Apr 5 '08 #3

P: n/a
On Apr 6, 9:25 am, Mark Dickinson <dicki...@gmail.comwrote:
On Apr 5, 6:19 pm, skanem...@yahoo.se wrote:
which is the best way to check if a string is an number or a char?
could the 2nd example be very expensive timewise if i have to check a
lot of strings?

You might be interested in str.isdigit:
>print str.isdigit.__doc__

S.isdigit() -bool

Return True if all characters in S are digits
and there is at least one character in S, False otherwise.
This doesn't cater for negative integers.

Apr 6 '08 #4

P: n/a
I always do it the first way. It is simpler, and should be faster.

Ditto. Using int() is best. It's clear, it's correct, and it
should be as fast as it gets.
>if c in '0123456789':
print "integer"
else:
print "char"

Also, the second way will only work on single-digit numbers
(you would have to iterate over the entire string with a for
loop to use it on numbers with more than one digit).
It also catches things like c="1234" but misses negative numbers
too. It's a bad solution on a number of levels. The isdigit()
method of a string does much of what int() does for testing "is
this an int" except that it too misses negative numbers.

-tkc
Apr 6 '08 #5

P: n/a
John Machin wrote:
On Apr 6, 9:25 am, Mark Dickinson <dicki...@gmail.comwrote:
>On Apr 5, 6:19 pm, skanem...@yahoo.se wrote:
>>which is the best way to check if a string is an number or a char?
could the 2nd example be very expensive timewise if i have to check a
lot of strings?
You might be interested in str.isdigit:
>>>>print str.isdigit.__doc__
S.isdigit() -bool

Return True if all characters in S are digits
and there is at least one character in S, False otherwise.

This doesn't cater for negative integers.
No, it doesn't, but

s.isdigit() or (s[0] in "+-" and s[1:].isdigit) # untested

does. and *may* be quicker than other examples. Not that speed is
usually a concern in validation routines anyway ...

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
Apr 6 '08 #6

P: n/a
John Machin wrote:
On Apr 6, 9:25 am, Mark Dickinson <dicki...@gmail.comwrote:
>On Apr 5, 6:19 pm, skanem...@yahoo.se wrote:
>>which is the best way to check if a string is an number or a char?
could the 2nd example be very expensive timewise if i have to check a
lot of strings?
You might be interested in str.isdigit:
>>>>print str.isdigit.__doc__
S.isdigit() -bool

Return True if all characters in S are digits
and there is at least one character in S, False otherwise.

This doesn't cater for negative integers.
No, it doesn't, but

s.isdigit() or (s[0] in "+-" and s[1:].isdigit) # untested

does. and *may* be quicker than other examples. Not that speed is
usually a concern in validation routines anyway ...

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/

Apr 6 '08 #7

P: n/a
In article <ma**************************************@python.o rg>,
Steve Holden <st***@holdenweb.comwrote:
This doesn't cater for negative integers.
No, it doesn't, but

s.isdigit() or (s[0] in "+-" and s[1:].isdigit) # untested

does.
I think this fails on " -1". So, then you start doing
s.strip().isdigit(), and then somebody else comes up with some other
unexpected corner case...

int(s) and catching any exception thrown just sounds like the best way.
Apr 6 '08 #8

P: n/a
On Apr 6, 10:23 am, Roy Smith <r...@panix.comwrote:
In article <mailman.2927.1207447793.9267.python-l...@python.org>,
Steve Holden <st...@holdenweb.comwrote:
This doesn't cater for negative integers.
No, it doesn't, but
s.isdigit() or (s[0] in "+-" and s[1:].isdigit) # untested
does.

I think this fails on " -1". So, then you start doing
s.strip().isdigit(), and then somebody else comes up with some other
unexpected corner case...

int(s) and catching any exception thrown just sounds like the best way.
Another corner case: Is "5.0" an integer or treated as one?

regards,
ernie
Apr 6 '08 #9

P: n/a
On Apr 6, 5:18 am, ernie <ernesto.ado...@gmail.comwrote:
On Apr 6, 10:23 am, Roy Smith <r...@panix.comwrote:
In article <mailman.2927.1207447793.9267.python-l...@python.org>,
Steve Holden <st...@holdenweb.comwrote:
This doesn't cater for negative integers.
No, it doesn't, but
s.isdigit() or (s[0] in "+-" and s[1:].isdigit) # untested
does.
I think this fails on " -1". So, then you start doing
s.strip().isdigit(), and then somebody else comes up with some other
unexpected corner case...
int(s) and catching any exception thrown just sounds like the best way.

Another corner case: Is "5.0" an integer or treated as one?

regards,
ernie
In Python, 5.0 is a float "5.0" is a string, and you need to make your
mind up about what type you want "5.0" to be represented as in your
program and code accordingly.

- Paddy.
Apr 6 '08 #10

P: n/a
On Sat, 5 Apr 2008 22:02:10 -0700 (PDT), Paddy <pa*******@googlemail.comwrote:
On Apr 6, 5:18 am, ernie <ernesto.ado...@gmail.comwrote:
>On Apr 6, 10:23 am, Roy Smith <r...@panix.comwrote:
int(s) and catching any exception thrown just sounds like the best way.

Another corner case: Is "5.0" an integer or treated as one?
In Python, 5.0 is a float "5.0" is a string, and you need to make your
mind up about what type you want "5.0" to be represented as in your
program and code accordingly.
int('5.0') raises an exception rather than rounding or truncating to
5. That is probably what most people want, and it seems the original
poster wanted that, too.

I always use int(n). If I ever find a situation where I want another
syntax for integers for some specialized use, I'll approach it as a
normal parsing problem and use regexes and so on -- wrapped in a
function.

The problem becomes clearer if you look at floats. There are many
different ways to write a float[0], and Python parses them better and
faster than you and me.

/Jorgen

[0] There would have been more if Python had supported hexadecimal
floating-point literals, like (I believe) C does.

--
// Jorgen Grahn <grahn@ Ph'nglui mglw'nafh Cthulhu
\X/ snipabacken.se R'lyeh wgah'nagl fhtagn!
Apr 6 '08 #11

P: n/a
Jorgen Grahn wrote:
[0] There would have been more if Python had supported hexadecimal
floating-point literals, like (I believe) C does.
C99 does. On the other hand, it isn't a feature I sorely missed during the
first 20 years or so of C's history, but you could always do some creative
byte twiddling if the need arouse.

Apr 6 '08 #12

P: n/a
byte twiddling if the need arouse.
I'm excited already :)

** Posted from http://www.teranews.com **
Apr 8 '08 #13

P: n/a
hmmm

int() does miss some stuff:
>>1E+1
10.0
>>int("1E+1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1E+1'

I wonder how you parse this?

I honestly thought until right now int() would understand that and
wanted to show that case as ease of use, I was wrong, so how do you
actually cast this type of input to an integer?

thanks
martin
--
http://tumblr.marcher.name
https://twitter.com/MartinMarcher
http://www.xing.com/profile/Martin_Marcher
http://www.linkedin.com/in/martinmarcher

You are not free to read this message,
by doing so, you have violated my licence
and are required to urinate publicly. Thank you.
Apr 8 '08 #14

P: n/a
arg, as posted earlier:

int("10.0") fails, it will of course work with float("1E+1") sorry for
the noise...

On Tue, Apr 8, 2008 at 10:32 PM, Martin Marcher <ma****@marcher.namewrote:
hmmm

int() does miss some stuff:
>>1E+1
10.0
>>int("1E+1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1E+1'

I wonder how you parse this?

I honestly thought until right now int() would understand that and
wanted to show that case as ease of use, I was wrong, so how do you
actually cast this type of input to an integer?

thanks
martin
--
http://tumblr.marcher.name
https://twitter.com/MartinMarcher
http://www.xing.com/profile/Martin_Marcher
http://www.linkedin.com/in/martinmarcher

You are not free to read this message,
by doing so, you have violated my licence
and are required to urinate publicly. Thank you.


--
http://tumblr.marcher.name
https://twitter.com/MartinMarcher
http://www.xing.com/profile/Martin_Marcher
http://www.linkedin.com/in/martinmarcher

You are not free to read this message,
by doing so, you have violated my licence
and are required to urinate publicly. Thank you.
Apr 8 '08 #15

P: n/a
1E+1 is short hand for a floating point number, not an interger.
>>float("1E+1")
10.0

You could convert the float to an integer if you wanted (i.e. ceiling,
floor, rounding, truncating, etc.).

Cheers,

Steve

-----Original Message-----
From: Martin Marcher [mailto:ma****@marcher.name]
Sent: Tuesday, April 08, 2008 1:32 PM
To: py*********@python.org
Subject: Re: Best way to check if string is an integer?

hmmm

int() does miss some stuff:
>>1E+1
10.0
>>int("1E+1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1E+1'

I wonder how you parse this?

I honestly thought until right now int() would understand that and
wanted to show that case as ease of use, I was wrong, so how do you
actually cast this type of input to an integer?

thanks
martin
--
http://tumblr.marcher.name
https://twitter.com/MartinMarcher
http://www.xing.com/profile/Martin_Marcher
http://www.linkedin.com/in/martinmarcher

You are not free to read this message,
by doing so, you have violated my licence
and are required to urinate publicly. Thank you.

Apr 8 '08 #16

P: n/a
Martin Marcher wrote:
hmmm

int() does miss some stuff:
>>>1E+1
10.0
>>>int("1E+1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1E+1'

I wonder how you parse this?

I honestly thought until right now int() would understand that and
wanted to show that case as ease of use, I was wrong, so how do you
actually cast this type of input to an integer?

thanks
martin

int(float("1E+1")) # untested

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/

Apr 8 '08 #17

This discussion thread is closed

Replies have been disabled for this discussion.