Как проверить, является ли строка числом (float)?

Каков наилучший способ проверить, может ли строка быть представлена ​​в виде числа в Python?

Теперь у меня есть функция:

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

Который, не только уродливый и медленный, кажется неуклюжим. Однако я не нашел лучшего метода, потому что вызов float в основной функции еще хуже.

+1491
09 дек. '08 в 20:03
источник поделиться
36 ответов
  • 1
  • 2

Я работал над проблемой, которая привела меня к этой теме, а именно: как конвертировать коллекцию данных в строки и числа наиболее интуитивно понятным способом. Я понял, прочитав исходный код, что то, что мне нужно, было различным по-разному:

1 - Мне нужен целочисленный результат, если строка представляет целое число

2 - Я хотел, чтобы число или результат строки вставлялись в структуру данных

поэтому я применил исходный код для создания этой производной:

def string_or_number(s):
    try:
        z = int(s)
        return z
    except ValueError:
        try:
            z = float(s)
            return z
        except ValueError:
            return s
0
09 нояб. '14 в 14:06
источник

Попробуйте это.

 def is_number(var):
    try:
       if var == int(var):
            return True
    except Exception:
        return False
0
30 мая '15 в 17:12
источник

Чтобы проверить, является ли входное значение float, вы можете сравнить тип ввода с float

def isFloat(s):
    realFloat = 0.1

    if type(s) == type(realFloat):
        return True
    else:
        return False

Возврат:

False     # s = 5
True      # s = 1.2345

Первоначальное сообщение фактически вернет True для s = 5, так как это число (целое число), и вы можете использовать int для float без ValueError. Если вы пытаетесь проверить, что это фактический float, а не просто номер, вам нужно будет учитывать этот случай.

0
16 сент. '16 в 5:00
источник

Функция помощника пользователя:

def if_ok(fn, string):
  try:
    return fn(string)
  except Exception as e:
    return None

тогда

if_ok(int, my_str) or if_ok(float, my_str) or if_ok(complex, my_str)
is_number = lambda s: any([if_ok(fn, s) for fn in (int, float, complex)])
0
15 авг. '19 в 22:18
источник

использовать его для всех случаев: -

import re
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.3') 
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.')
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '.3')
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.3sd')
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.3')
-1
24 февр. '17 в 11:11
источник

У меня аналогичная проблема. Вместо определения функции isNumber я хочу преобразовать список строк в float, то, что в терминах высокого уровня будет:

[ float(s) for s in list if isFloat(s)]

Это заданное мы не можем действительно отделить float (s) от функций isFloat (s): эти два результата должны быть возвращены одной и той же функцией. Кроме того, если сбой (float) сбой, весь процесс выходит из строя, а не просто игнорирует неисправный элемент. Кроме того, "0" является допустимым числом и должно быть включено в список. При фильтрации неправильных элементов будьте уверены, что не следует исключать 0.

Поэтому вышеприведенное понимание должно быть каким-то образом изменено:

  • если какой-либо элемент в списке не может быть преобразован, игнорировать его и не вызывать исключение
  • избегайте вызывать float более одного раза для каждого элемента (один для преобразования, другой для теста)
  • если преобразованное значение равно 0, оно все равно должно присутствовать в конечном списке

Я предлагаю решение, основанное на Nullable числовых типах С#. Эти типы внутренне представлены структурой, которая имеет числовое значение и добавляет логическое значение, указывающее, действительно ли значение:

def tryParseFloat(s):
    try:
        return(float(s), True)
    except:
        return(None, False)

tupleList = [tryParseFloat(x) for x in list]
floats = [v for v,b in tupleList if b]
-1
18 мар. '18 в 0:18
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос