Вопрос-Ответ

How do I parse a string to a float or int?

Как мне преобразовать строку в float или int?

Как я могу преобразовать str в float?

"545.2222" -> 545.2222

Или str в a int?

"31" -> 31

Чтобы узнать об обратном, см. раздел Преобразование целого числа в строку в Python и Преобразование float в строку без округления.

Пожалуйста, вместо этого используйте Как я могу читать входные данные как числа? чтобы закрыть повторяющиеся вопросы, где OP получил строку из пользовательского ввода и немедленно хочет преобразовать ее, или надеялся на input (в 3.x) преобразовать тип автоматически.

Переведено автоматически
Ответ 1
>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545
Ответ 2

Метод Python2 для проверки, является ли строка float:

def is_float(value):
if value is None:
return False
try:
float(value)
return True
except:
return False

Для версии is_float на Python3 смотрите: Проверка того, может ли строка быть преобразована в float в Python

Более длинное и точное название для этой функции могло бы быть: is_convertible_to_float(value)

Что такое float в Python, а что нет, может вас удивить:

Приведенные ниже модульные тесты были выполнены с использованием python2. Убедитесь, что Python3 ведет себя по-разному для того, какие строки можно преобразовать в float. Одно из сбивающих с толку отличий заключается в том, что теперь разрешено любое количество внутренних подчеркиваний: (float("1_3.4") == float(13.4)) является True

val                   is_float(val) Note
-------------------- ---------- --------------------------------
"" False Blank string
"127" True Passed string
True True Pure sweet Truth
"True" False Vile contemptible lie
False True So false it becomes true
"123.456" True Decimal
" -127 " True Spaces trimmed
"\t\n12\r\n" True whitespace ignored
"NaN" True Not a number
"NaNanananaBATMAN" False I am Batman
"-iNF" True Negative infinity
"123.E4" True Exponential notation
".1" True mantissa only
"1_2_3.4" False Underscores not allowed
"12 34" False Spaces not allowed on interior
"1,234" False Commas gtfo
u'\x30' True Unicode is fine.
"NULL" False Null is not special
0x3fade True Hexadecimal
"6e7777777777777" True Shrunk to infinity
"1.797693e+308" True This is max value
"infinity" True Same as inf
"infinityandBEYOND" False Extra characters wreck it
"12.34.56" False Only one dot allowed
u'四' False Japanese '4' is not a float.
"#56" False Pound sign
"56%" False Percent of what?
"0E0" True Exponential, move dot 0 places
0**0 True 0___0 Exponentiation
"-5e-5" True Raise to a negative number
"+1e1" True Plus is OK with exponent
"+1e1^5" False Fancy exponent not interpreted
"+1e1.3" False No decimals in exponent
"-+1" False Make up your mind
"(1)" False Parenthesis is bad

Ты думаешь, что знаешь, что такое числа? Ты не так хорош, как думаешь! Неудивительно.

Не используйте этот код в критически важном программном обеспечении!

Перехват широких исключений таким образом, уничтожение канареек и поглощение исключения создает крошечную вероятность того, что допустимый float в виде строки вернет false . В float(...) строке кода может произойти сбой по любой из тысячи причин, которые не имеют ничего общего с содержимым строки. Но если вы пишете критически важное программное обеспечение на языке прототипов с утиным набором текста, таком как Python, то у вас гораздо большие проблемы.

Ответ 3
def num(s):
try:
return int(s)
except ValueError:
return float(s)
Ответ 4

Еще один метод, который заслуживает упоминания здесь, это ast.literal_eval:


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


То есть безопасная 'оценка'

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31
python