python - string数字 - 字符串转int




如何在Python中将字符串解析为float或int? (15)

在Python中,我怎样才能解析一个数字字符串像"545.2222"到它相应的浮点值542.2222 ? 或者将字符串"31"解析为一个整数31

我只想知道如何将一个浮点 string解析为一个float ,然后(单独)将一个int string解析为一个int


在Python中,我怎样才能解析一个数字字符串像“545.2222”到它相应的浮点值542.2222? 或者将字符串“31”解析为一个整数31? 我只想知道如何将一个浮点字符串解析为一个浮点数,然后(单独)将一个int字符串解析为一个int。

你要求分开做这件事很好。 如果你将它们混合在一起,你可能会在稍后为自己设置问题。 简单的答案是:

"545.2222"浮动:

>>> float("545.2222")
545.2222

"31"为整数:

>>> int("31")
31

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

来自不同基地的转化,你应该提前知道基地(默认为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和Python 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八进制转换为使用0o前缀在2和3中工作的八进制:

>>> 0o37
31

本地化和逗号

对于像float("545,545.2222")这样引发异常的情况,您应该考虑逗号在数字的字符串表示中的可能性。 相反,使用locale方法将字符串转换为数字并正确解释逗号。 一旦语言环境设置为所需的数字约定, locale.atof方法就会在一步中转换为浮点数。

例1 - 美国数字惯例

在美国和英国,逗号可以用作千位分隔符。 在美国语言环境的这个例子中,逗号作为分隔符被正确处理:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

例2 - 欧洲数字惯例

在世界大多数国家中 ,逗号用于十进制标记而不是句号。 在这个使用法语区域设置的示例中,逗号被正确处理为小数点标记:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

方法locale.atoi也可用,但参数应该是一个整数。


Python在一行中有很好的解析灵活性。

str = "545.2222"
print ("int: ", + int(float(a)))
print ("float: ", +(float(a)))

YAML解析器可以帮助你找出你的字符串是什么数据类型。 使用yaml.load() ,然后你可以使用type(result)来测试type:

>>> import yaml

>>> a = "545.2222"
>>> result = yaml.load(a)
>>> result
545.22220000000004
>>> type(result)
<type 'float'>

>>> b = "31"
>>> result = yaml.load(b)
>>> result
31
>>> type(result)
<type 'int'>

>>> c = "HI"
>>> result = yaml.load(c)
>>> result
'HI'
>>> type(result)
<type 'str'>

这是 https://.com/a/33017514/5973334 的更正版本

这将尝试解析一个字符串并根据字符串表示的内容返回intfloat 。 它可能会引发解析异常或产生一些意外行为 。

  def get_int_or_float(v):
        number_as_float = float(v)
        number_as_int = int(number_as_float)
        return number_as_int if number_as_float == number_as_int else 
        number_as_float

你需要考虑四舍五入来正确地做到这一点。

即int(5.1)=> 5 int(5.6)=> 5 - 错误,应该是6,所以我们做int(5.6 + 0.5)=> 6

def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)

使用:

def num(s):
    try:
        for each in s:
            yield int(each)
    except ValueError:
        yield float(each)
a = num(["123.55","345","44"])
print a.next()
print a.next()

这是我能想出的最Pythonic的方式。


如果您不反对第三方模块,则可以检出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

我很惊讶没有人提到过正则表达式,因为有时候字符串必须在投射到数字之前做好准备和规范化

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

用户codelogicharley是正确的,但要记住,如果你知道字符串是一个整数(例如545),你可以调用int(“545”)而不需要首先强制浮动。

如果你的字符串在列表中,你也可以使用map函数。

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

只有它们都是同一类型才是好事。


这是另一种值得在此提及的方法, ast.literal_eval

这可用于安全地评估包含来自不受信任来源的Python表达式的字符串,而无需自行解析值。

也就是说,一个安全的“评估”

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

这是对你的问题的另一种解释(提示:它是模糊的)。 你可能在寻找这样的东西:

def parseIntOrFloat( aString ):
    return eval( aString )

它是这样工作的...

>>> parseIntOrFloat("545.2222")
545.22220000000004
>>> parseIntOrFloat("545")
545

理论上讲,存在注入漏洞。 例如,字符串可以是"import os; os.abort()" 。 然而,没有任何关于弦线来自哪里的背景,这种可能性就是理论上的猜测。 由于这个问题很模糊,所以这个漏洞是否真的存在还不是很清楚。


def get_int_or_float(v):
    number_as_float = float(v)
    number_as_int = int(number_as_float)
    return number_as_int if number_as_float == number_as_int else number_as_float

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

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




integer