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


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

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


当前回答

def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

其他回答

a = int(float(a)) if int(float(a)) == float(a) else float(a)
float(x) if '.' in x else int(x)

还有正则表达式,因为有时字符串在转换为数字之前必须准备好并规范化:

import re

def parseNumber(value, as_int=False):
    try:
        number = float(re.sub('[^.\-\d]', '', value))
        if as_int:
            return int(number + 0.5)
        else:
            return number
    except ValueError:
        return float('nan')  # or None if you wish

用法:

parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999\n')
> 99999.0

顺便说一句,有些东西可以验证你有一个号码:

import numbers
def is_number(value):
    return isinstance(value, numbers.Number)
    # Will work with int, float, long, Decimal

如果您不想使用第三方模块,以下可能是最可靠的解决方案:

def string_to_int_or_float(s):
    try:
        f = float(s) # replace s with str(s) if you are not sure that s is a string
    except ValueError:
        print("Provided string '" + s + "' is not interpretable as a literal number.")
        raise
    try:
        i = int(str(f).rstrip('0').rstrip('.'))
    except:
        return f
    return i

它可能不是最快的,但在许多其他解决方案失败的情况下,它可以正确处理字面数字,例如:

>>> string_to_int_or_float('789.')
789
>>> string_to_int_or_float('789.0')
789
>>> string_to_int_or_float('12.3e2')
1230
>>> string_to_int_or_float('12.3e-2')
0.123
>>> string_to_int_or_float('4560e-1')
456
>>> string_to_int_or_float('4560e-2')
45.6

在Python中,如何将“545.2222”这样的数字字符串解析为其对应的浮点值542.2222?或者将字符串“31”解析为整数31?我只想知道如何将浮点字符串解析为浮点,并(分别)将int字符串解析为int。

你要求单独做这些很好。如果你把它们混合在一起,你可能会为以后的问题做准备。简单的答案是:

“545.2222”浮动:

>>> float("545.2222")
545.2222

“31”转换为整数:

>>> int("31")
31

其他转换,字符串和文字之间的int:

不同基数的转换,你应该提前知道基数(默认值为10)。请注意,您可以使用Python对其文本所期望的前缀(见下文)或删除前缀:

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

如果您事先不知道基数,但您知道它们将具有正确的前缀,那么如果您将0作为基数传递,Python可以为您推断出这一点:

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

其他基数的非十进制(即整数)文字

然而,如果您的动机是让自己的代码清楚地表示硬编码的特定值,那么您可能不需要从基转换-您可以让Python使用正确的语法自动为您进行转换。

您可以使用apropos前缀自动转换为具有以下文字的整数。这些对Python 2和3有效:

二进制,前缀0b

>>> 0b11111
31

八进制,前缀0o

>>> 0o37
31

十六进制,前缀0x

>>> 0x1f
31

这在描述二进制标志、代码中的文件权限或颜色的十六进制值时非常有用-例如,请注意不要引号:

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

使模糊的Python 2八进制与Python 3兼容

如果在Python 2中看到以0开头的整数,则这是(不推荐使用的)八进制语法。

>>> 037
31

这很糟糕,因为它看起来应该是37。因此在Python 3中,它现在引发了一个SyntaxError:

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

将Python 2八进制转换为同时在2和3中使用0o前缀的八进制:

>>> 0o37
31