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


在Python中,我如何解析像这样的数字字符串 "545.2222" 到它对应的浮点值, 542.2222?或者解析字符串 "31" 到整数, 31

我只是想知道如何解析一个 浮动  string 到了 float和(另外)一个 INT  string 到了 int


1761
2017-12-19 01:52


起源


作为一般规则,如果您在Python中有一个对象,并且想要转换 至 那种对象,叫 type(my_object) 在上面。结果通常可以作为执行转换的函数调用。例如 type(100) 结果是 int,所以你可以打电话 int(my_object) 尝试转换 my_object 到整数。这并不总是有效,但在编码时是一个很好的“第一猜测”。 - robertlayton


答案:


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

2087
2017-12-19 01:54



只是想知道为什么到底有'04'?为什么不简单'00'?我目前的python版本没有'04'。 - Mangat Rai Modi
@MangatRaiModi浮点数本身就不完美,表示小数。有关更多信息,请参阅 stackoverflow.com/q/21895756/931277 - dokkaebi
为什么不简单 int(a) 但 int(float(a))? - user463035818
int(a) 将给出一个错误,该字符串不是一个有效的整数: ValueError: invalid literal for int() with base 10: '545.222',但是从float转换为int是受支持的转换。 - David Parks


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

443
2017-12-19 02:31



含蓄 混合浮子/整体可能会导致细微的错误,因为使用浮子或不同的结果可能会导致精度损失 / 浮子/整体上的操作员。根据上下文,可能最好返回int或float,而不是两者。 - jfs
@ J.F.Sebastian你是完全正确的,但有时你想要输入来决定它将是哪一个。让输入决定哪一个可以很好地使用鸭子打字。 - TimothyAWiseman
你可以嵌套另一个 try 当它无法转换为浮动时抛出异常。 - iBug


用于检查字符串是否为float的Python方法:

def isfloat(value):
  try:
    float(value)
    return True
  except:
    return False

此功能的更长,更准确的名称可能是: isConvertibleToFloat(value)

什么是,而不是浮动 蟒蛇 可能会让你吃惊

val                   isfloat(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,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

你认为你知道什么数字?你没有想象的那么好!不是很大的惊喜。


416
2018-01-05 04:15



请考虑将您的功能重命名为 convertibleToFloat 或类似的东西(现在的名字似乎令人困惑,至少对我而言)。 - MKPS


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

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

也就是说,安全'评估'

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

104
2018-03-01 04:23



这是 不 一个很好的解决方案。它在Python 2中运行良好,但在Python 3中会发生以下情况: python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>   为了澄清为什么这是一个问题,如果你想让它单独留下电话号码而不是假设它们是数学表达式,那么这种方法不适合你。 - royce3
@ royce3是的,这是一个好点,用户应该提防。最初修改了该行为是为了解决复杂文字解析的一些问题。它可以说是一个错误 ast.literal_eval,并已讨论过 这里。 - wim


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

74
2017-12-19 02:32



Nitpick:不适用于像浮子这样的极端情况(“2e-3”) - Emile
注意:处理作为字符串传递的金额时要小心,因为有些国家使用“,”作为小数分隔符 - Ben G
@Emile:我不会称“2e-3”为“极端情况”。这个答案刚好被打破了。 - jchl
@BenG不要把钱当作浮动来操纵。那是在惹麻烦。用十进制钱! (但你对','的评论仍然有效且重要) - ToolmakerSteve
不要忘记“非数字”(NaN)和+/-无穷大也是有效的浮点值。所以 float("nan") 是一个完全有效的浮动值,上面的答案根本无法捕获 - Ronny Andersson


本地化和逗号

对于像这样的情况,您应该考虑数字的字符串表示中逗号的可能性 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 也可用,但参数应该是整数。


45
2017-07-23 16:00





用户 codelogic 和 哈雷 是正确的,但请记住,如果你知道字符串是一个整数(例如,545)你可以调用int(“545”)而不首先转换为float。

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

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

如果它们都是相同的类型,那就好了。


22
2017-12-19 02:09