如何将str转换为float?"545.2222" → 545.2222如何将str转换为int?"31" → 31


相反,请参见在Python中将整数转换为字符串和将浮点转换为字符串而不舍入。

请改为使用“如何将输入读取为数字?”?关闭重复问题,其中OP从用户输入中接收到字符串并立即想要转换它,或者希望输入(在3.x中)自动转换类型。


当前回答

Python2方法检查字符串是否为浮点:

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

有关is_float的Python3版本,请参见:检查字符串是否可以在Python中转换为float

此函数的较长且更准确的名称可以是:is_converable_to_float(value)

Python中的浮点数是什么,不是什么,可能会让您感到惊讶:

以下单元测试是使用python2完成的。检查Python3对于哪些字符串可以转换为浮点,有不同的行为。一个令人困惑的区别是,现在允许任意数量的内部下划线:(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 as字符串将返回false。float(…)行代码可能由于一千种与字符串内容无关的原因而失败。但如果你用Python这样的鸭子型原型语言编写生命关键型软件,那么你会遇到更大的问题。

其他回答

如果您不反对第三方模块,可以查看fastnumbers模块。它提供了一个名为fast_real的函数,它完全符合这个问题的要求,并且比纯Python实现更快:

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int
def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)
float(x) if '.' in x else int(x)

Python2方法检查字符串是否为浮点:

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

有关is_float的Python3版本,请参见:检查字符串是否可以在Python中转换为float

此函数的较长且更准确的名称可以是:is_converable_to_float(value)

Python中的浮点数是什么,不是什么,可能会让您感到惊讶:

以下单元测试是使用python2完成的。检查Python3对于哪些字符串可以转换为浮点,有不同的行为。一个令人困惑的区别是,现在允许任意数量的内部下划线:(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 as字符串将返回false。float(…)行代码可能由于一千种与字符串内容无关的原因而失败。但如果你用Python这样的鸭子型原型语言编写生命关键型软件,那么你会遇到更大的问题。

>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545