Этот вопрос уже имеет ответ здесь:
Есть ли некоторая функция как str.isnumeric
но применимый к плаванию?
'13.37'.isnumeric() #False
Я все еще использую это:
def isFloat(string):
try:
float(string)
return True
except ValueError:
return False
Как говорит Имран, ваш код абсолютно хорош, как показано.
Тем не менее, он побуждает клиентов isFloat
идти по пути «Посмотрите, прежде чем прыгать» вместо более питонического пути «Проще просить прощения, чем разрешения».
Для клиентов больше Python предполагать, что у них есть строка, представляющая число с плавающей запятой, но быть готовыми обработать исключение, которое будет сгенерировано, если это не так.
Этот подход также имеет приятный побочный эффект - преобразование строки в число с плавающей запятой один раз вместо двух.
Ваш код в порядке. Решения на основе регулярных выражений более склонны к ошибкам.
Быстрое тестирование с 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 ()
с радостью преобразует его в правильное значение с плавающей запятой.
isinstance (myVariable, float)
будет работать, если вы тестируете переменную с плавающей запятой.
Редактировать: Слишком рано заговорил, не совсем понял, что вы пытались получить.