Подтвердить что ты не робот

Как проверить, может ли строка быть подвергнута типу для float в Python?

Есть ли какая-то функция типа str.isnumeric, но применима для float?

'13.37'.isnumeric() #False  

Я все еще использую это:

def isFloat(string):
    try:
        float(string)
        return True
    except ValueError:
        return False
4b9b3361

Ответ 1

Как говорит Имран, ваш код абсолютно прекрасен, как показано.

Тем не менее, он поощряет клиентов isFloat вниз по пути "Look Before You Leap" вместо того, чтобы путь Pythonic "проще просить прощения, чем разрешение".

Это больше Pythonic для клиентов, чтобы предположить, что у них есть строка, представляющая float, но будьте готовы обработать исключение, которое будет выбрано, если это не так.

Этот подход также имеет хороший побочный эффект преобразования строки в float один раз вместо двух.

Ответ 2

Небольшое обобщение:

def strType(var):
    try:
        if int(var) == float(var):
            return 'int'
    except:
        try:
            float(var)
            return 'float'
        except:
            return 'str'

Ответ 3

Ваш код в порядке. Решения на основе выражений чаще всего подвержены ошибкам.

Быстрое тестирование с timeit показывает float(str_val) действительно быстрее, чем re.match()

>>> timeit.timeit('float("-1.1")')
1.2833082290601467
>>> timeit.timeit(r"pat.match('-1.1')", "import re; pat=re.compile(r'^-?\d*\.?\d+(?:[Ee]-?\d+)?$');")
1.5084138986904527

И используемое выше выражение не выдает один крайный аргумент, он не может соответствовать '-1.', хотя float() с радостью преобразует его в соответствующее значение float.

Ответ 4

Там есть уловка: float ('nan') возвращает nan, исключение исключено;)

Ответ 5

Расширение от результатов @Imran:

>>> timeit('float("-1.1")', number=10000000)
1.365271806716919

>>> timeit(r"isfloat('-1.1')", """def isfloat(s): t = s.partition('.');
           return t[1] and t[0].isdigit() and (not t[2] or t[2].isdigit());""",
           number=10000000)
2.565232992172241

>>> timeit(r"pat.match('-1.1')", "import re; pat=re.compile(r'^-?\d*\.?\d+(
    ...: ?:[Ee]-?\d+)?$');", number=10000000)
3.258622169494629

My partition решение намного быстрее, чем регулярное выражение, но медленнее, чем float; однако имеет то преимущество, что не поднимает ошибок (поэтому вы можете использовать его, например, в понимании).

Это обрабатывает граничные условия, такие как 1., но не такие специализации, как NaN.

Ответ 6

isinstance(myVariable, float) будет работать, если вы тестируете переменную с плавающей точкой.

Изменить: слишком быстро говорили, не совсем понимали, что вы пытались получить.