[python] Как проверить, соответствует ли строка int, не используя try / except?


5 Answers

с положительными целыми числами, которые вы могли бы использовать .isdigit :

>>> '16'.isdigit()
True

однако он не работает с отрицательными целыми числами. предположим, что вы можете попробовать следующее:

>>> s = '-17'
>>> s.startswith('-') and s[1:].isdigit()
True

он не будет работать с форматом '16.0' , который подобен int casting в этом смысле.

Редактировать :

def check_int(s):
    if s[0] in ('-', '+'):
        return s[1:].isdigit()
    return s.isdigit()
Question

Есть ли способ определить, представляет ли строка целое число (например, '3' , '-17' но не '3.14' или 'asfasfas' ) Без использования механизма try / except?

is_int('3.14') = False
is_int('-7')   = True



Вот функция, которая анализирует без ошибок. Он обрабатывает очевидные случаи. Возвращает None при отказе (по умолчанию на CPython обрабатывает знаки до 2000 '- / +'):

#!/usr/bin/env python

def get_int(number):
    splits = number.split('.')
    if len(splits) > 2:
        # too many splits
        return None
    if len(splits) == 2 and splits[1]:
        # handle decimal part recursively :-)
        if get_int(splits[1]) != 0:
            return None

    int_part = splits[0].lstrip("+")
    if int_part.startswith('-'):
        # handle minus sign recursively :-)
        return get_int(int_part[1:]) * -1
    # successful 'and' returns last truth-y value (cast is always valid)
    return int_part.isdigit() and int(int_part)

Некоторые тесты:

tests = ["0", "0.0", "0.1", "1", "1.1", "1.0", "-1", "-1.1", "-1.0", "-0", "--0", "---3", '.3', '--3.', "+13", "+-1.00", "--+123", "-0.000"]

for t in tests:
    print "get_int(%s) = %s" % (t, get_int(str(t)))

Результаты:

get_int(0) = 0
get_int(0.0) = 0
get_int(0.1) = None
get_int(1) = 1
get_int(1.1) = None
get_int(1.0) = 1
get_int(-1) = -1
get_int(-1.1) = None
get_int(-1.0) = -1
get_int(-0) = 0
get_int(--0) = 0
get_int(---3) = -3
get_int(.3) = None
get_int(--3.) = 3
get_int(+13) = 13
get_int(+-1.00) = -1
get_int(--+123) = 123
get_int(-0.000) = 0

Для ваших нужд вы можете использовать:

def int_predicate(number):
     return get_int(number) is not None



Uh .. Попробуйте следующее:

def int_check(a):
    if int(a) == a:
        return True
    else:
        return False

Это работает, если вы не ставите строку, которая не является числом.

А также (я забыл поставить часть проверки числа.), Есть функция, проверяющая, является ли строка числом или нет. Это str.isdigit (). Вот пример:

a = 2
a.isdigit()

Если вы вызываете a.isdigit (), он вернет True.




Подход Грега Хьюджилла отсутствовал в нескольких компонентах: ведущий «^», чтобы соответствовать началу строки, и компилировать повтор заранее. Но этот подход позволит вам избежать попытки: кроме:

import re
INT_RE = re.compile(r"^[-]?\d+$")
def RepresentsInt(s):
    return INT_RE.match(str(s)) is not None

Мне было бы интересно, почему вы пытаетесь избежать попытки: кроме?




Используйте регулярное выражение:

import re
def RepresentsInt(s):
    return re.match(r"[-+]?\d+$", s) is not None

Если вы также должны принять десятичные дроби:

def RepresentsInt(s):
    return re.match(r"[-+]?\d+(\.0*)?$", s) is not None

Для повышения производительности, если вы часто это делаете, скомпилируйте регулярное выражение только один раз, используя re.compile() .




я думаю

s.startswith('-') and s[1:].isdigit()

было бы лучше переписать:

s.replace('-', '').isdigit()

потому что s [1:] также создает новую строку

Но гораздо лучшее решение

s.lstrip('+-').isdigit()



Related