Определение типа числа, хранящегося в виде строки

#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)
  

Не передавайте ненадежный код в эту функцию 😉