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

Самый простой способ - просто использовать Underscore.js:

keys

_. keys (object) Извлечь все имена свойств объекта.

_. ключи ({один: 1, два: 2, три: 3}); => ["one", "two", "three"]

Да, вам нужна дополнительная библиотека, но это так просто!

1449
задан martineau 4 July 2017 в 18:05
поделиться

7 ответов

, Который, не только ужасно и медленный

, я оспаривал бы обоих.

А regex или другой строковый метод парсинга были бы более ужасными и медленнее.

я не уверен, что что-либо очень могло быть быстрее, чем вышеупомянутое. Это вызывает функцию и возвраты. Попытка/Выгода не представляет много служебное, потому что наиболее распространенное исключение поймано без обширного поиска стековых фреймов.

проблема - то, что любая числовая функция преобразования имеет два вида результатов

  • число А, если число допустимо
  • код статуса А (например, через errno) или исключение, чтобы показать, что никакой верный номер не мог быть проанализирован.

C (как пример) бездельничает это много путей. Python размечает его ясно и явно.

я думаю Ваш код для того, чтобы сделать, это прекрасно.

639
ответ дан Alec Alameddine 4 July 2017 в 18:05
поделиться

Кастинг для плавания и ловля ValueError является, вероятно, самым быстрым путем, так как плавание () конкретно предназначено для просто этого. Что-либо еще, что требует строкового парсинга (regex, и т.д.), вероятно, будет медленнее вследствие того, что он не настраивается для этой операции. Мои 0,02$.

11
ответ дан codelogic 4 July 2017 в 18:05
поделиться

В случае, если Вы ищете парсинг (положительный, неподписанный) целые числа вместо плаваний, можно использовать isdigit() функция для строковых объектов.

>>> a = "03523"
>>> a.isdigit()
True
>>> b = "963spam"
>>> b.isdigit()
False

Строковые Методы - isdigit()

на строках Unicode существует также что-то, которые я не слишком знаком с , Unicode - десятичный/десятичный

1472
ответ дан Alfe 4 July 2017 в 18:05
поделиться

то, Которое, не только является ужасным и медленным, кажется неуклюжим.

могут потребоваться некоторые привыкающие к, но это - pythonic способ сделать его. Как был уже указан, альтернативы хуже. Но существует еще одно преимущество выполнения вещей этот путь: полиморфизм.

центральная идея позади утиного ввода состоит в том, что, "если он идет и говорит как утка, затем это - утка". Что, если Вы решаете, что необходимо разделить строку на подклассы так, чтобы можно было измениться, как Вы определяете, может ли что-то быть преобразовано в плавание? Или что, если Вы решаете протестировать некоторый другой объект полностью? Можно сделать эти вещи, не имея необходимость изменять вышеупомянутый код.

Другие языки решают эти проблемы при помощи интерфейсов. Я сохраню анализ, которого решение лучше для другого потока. Точка, тем не менее, - то, что Python находится решительно на утке, вводящей сторону уравнения, и Вы, вероятно, оказываетесь перед необходимостью привыкать к синтаксису как это, если Вы планируете выполнение большого программирования в Python (но это не означает, что необходимо понравиться он, конечно).

Еще одна вещь Вы могли бы хотеть учесть: Python довольно быстр в броске и ловле исключений по сравнению с большим количеством других языков (30x быстрее, чем .NET, например). Heck, сам язык даже выдает исключения для передачи неисключительных, нормальных условий программы (каждый раз, когда Вы используете для цикла). Таким образом я не волновался бы слишком много об аспектах производительности этого кода, пока Вы не замечаете значительной проблемы.

37
ответ дан Jason Baker 5 July 2017 в 04:05
поделиться

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

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
ответ дан Samantha Atkins 29 August 2019 в 15:57
поделиться
  • 1
    Большой продолжают для iOS 7.0. Сохраните меня некоторая головная боль. – Rick 1 October 2013 в 03:25

Вот мой простой способ сделать это. Допустим, я просматриваю несколько строк и хочу добавить их в массив, если они окажутся числами.

try:
    myvar.append( float(string_to_check) )
except:
    continue

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

0
ответ дан 22 November 2019 в 20:15
поделиться

Обновлено после того, как Алфе указал, что вам не нужно отдельно проверять наличие числа с плавающей запятой, поскольку комплексные обрабатывают оба:

def is_number(s):
    try:
        complex(s) # for int, long, float and complex
    except ValueError:
        return False

    return True

Ранее сказано: В некоторых редких случаях вам также может потребоваться проверка комплексных чисел (например, 1 + 2i), которые не может быть представлено числом с плавающей запятой:

def is_number(s):
    try:
        float(s) # for int, long and float
    except ValueError:
        try:
            complex(s) # for complex
        except ValueError:
            return False

    return True
40
ответ дан 22 November 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: