Проверка возможности преобразования строки в плавающее в Python - PullRequest
141 голосов
/ 10 апреля 2009

У меня есть некоторый код Python, который пробегает список строк и преобразует их в целые числа или числа с плавающей запятой, если это возможно. Сделать это для целых чисел довольно просто

if element.isdigit():
  newelement = int(element)

Числа с плавающей точкой сложнее. Сейчас я использую partition('.') для разделения строки и проверяю, чтобы одна или обе стороны были цифрами.

partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit()) 
    or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit()) 
    or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
  newelement = float(element)

Это работает, но, очевидно, выражение if для этого является чем-то вроде медведя. Другое решение, которое я рассмотрел, - просто обернуть преобразование в блок try / catch и посмотреть, успешно ли оно выполнено, как описано в этот вопрос .

У кого-нибудь есть еще идеи? Мнения об относительных достоинствах раздела и подходах try / catch?

Ответы [ 13 ]

1 голос
/ 16 октября 2016

Я использовал уже упоминавшуюся функцию, но вскоре заметил, что строки как «Nan», «Inf» и ее вариация считаются числом. Поэтому я предлагаю вам улучшенную версию функции, которая будет возвращать false при вводе такого типа и не потерпит неудачу с вариантами «1e3»:

def is_float(text):
    # check for nan/infinity etc.
    if text.isalpha():
        return False
    try:
        float(text)
        return True
    except ValueError:
        return False
0 голосов
/ 18 марта 2018

Я искал похожий код, но, похоже, использование try / excepts - лучший способ. Вот код, который я использую. Включает функцию повтора, если ввод неверен. Мне нужно было проверить, было ли входное значение больше 0, и если это так, преобразовать его в число с плавающей точкой.

def cleanInput(question,retry=False): 
    inputValue = input("\n\nOnly positive numbers can be entered, please re-enter the value.\n\n{}".format(question)) if retry else input(question)
    try:
        if float(inputValue) <= 0 : raise ValueError()
        else : return(float(inputValue))
    except ValueError : return(cleanInput(question,retry=True))


willbefloat = cleanInput("Give me the number: ")
0 голосов
/ 24 сентября 2016
str(strval).isdigit()

кажется простым.

Обрабатывает значения, хранящиеся в виде строки или целого числа или числа с плавающей запятой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...