#python
#python
Вопрос:
Как мне определить, является ли число, хранящееся в виде строки, int или float?
Например:
def isint(x):
if f(x):
print 'this is an int'
else:
print 'this is a float'
>>> x = '3'
>>> isint(x)
>>> this is an int
>>> x = '3.14159'
>>> isint(x)
>>> this is a float
Какая требуется f(x)
функция?
Одним из решений является преобразование x в число с плавающей точкой, поиск r = x % 1
, а затем определение того, r == 0
является ли. Но есть ли что-нибудь встроенное в Python, что делает это для меня более аккуратно?
Комментарии:
1. Для чего должен быть результат
isint('3.0')
?2. Да, хорошая мысль! Я бы хотел, чтобы оно сообщало мне, что ‘3.0’ в данном случае является значением с плавающей запятой. Я думаю, что приведенный ниже ответ также касается этого.
Ответ №1:
Вы можете использовать ast.literal_eval
:
>>> from ast import literal_eval
>>> type(literal_eval('1.01'))
<type 'float'>
>>> type(literal_eval('1'))
<type 'int'>
>>> type(literal_eval('1 0j'))
<type 'complex'>
Если вы также хотите выполнить некоторую проверку работоспособности, на случай, если пользователь может также передать нечисловую строку:
import numbers
from ast import literal_eval
def number_type(x):
try:
n = literal_eval(x)
if isinstance(n, numbers.Number):
print type(n).__name__
else:
print 'not a number'
except (ValueError, SyntaxError):
print 'not a number'
Комментарии:
1. Итак, как мне на самом деле реализовать это в
f(x)
? Я пыталсяif type(literal_eval('1.01')) == "<type, 'float'>"
, но это не сработало.2. Используйте @Karnivaurus
isinstance(literal_eval('1.01'), int)
(заменитеint
наfloat
для проверки действительных чисел).
Ответ №2:
Вы можете использовать try/except
блок, чтобы посмотреть, можно ли преобразовать номер строки в целое число:
def isint(x):
try:
int(x)
print 'this is an int'
except ValueError:
print 'this is an float'
Смотрите демонстрацию ниже:
>>> def isint(x):
... try:
... int(x)
... print 'this is an int'
... except ValueError:
... print 'this is an float'
...
>>> isint('123')
this is an int
>>> isint('123.0')
this is an float
>>>
Если вы хотите защитить пользователя от ввода нечисловой строки, вы можете добавить еще один уровень обработки ошибок:
def isint(x):
try:
int(x)
print 'this is an int'
except ValueError:
try:
float(x)
print 'this is an float'
except ValueError:
print 'this is not a number'
Ответ №3:
>>> def isint(x):
return '.' not in x
>>> isint("3.14")
False
>>> isint("3")
True
Комментарии:
1. @MartinKonecny ах, хороший вызов, нужна более надежная обработка плохих случаев
Ответ №4:
Я думаю, что самый простой вариант — использовать eval:
eval("1.7") => 1.7 => type=float
eval("1") => 1 => type=int
eval("143274892053294870824") => 143274892053294870824 => type=long
isint = lambda x: isinstance(eval(x), int)
Не передавайте ненадежный код в эту функцию 😉