如何将字符串解析为浮点数或整数?

问:

如何将 str 转换为浮点数? “545.2222”→ 545.2222

如何将 str 转换为 int? “31”→31

答1:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

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

只是想知道为什么最后会有'04'?为什么不简单地“00”?我当前的python版本也没有'04'。

@MangatRaiModi 浮点数本质上不适合表示小数。有关详细信息,请参阅stackoverflow.com/q/21895756/931277

为什么不是简单的 int(a) 而是 int(float(a)) ?

int(a) 将给出字符串不是有效整数的错误:ValueError: invalid literal for int() with base 10: '545.222',但从 float 转换为 int 是受支持的转换。

如果您想安全起见,您应该处理 ValueError

答2:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

检查字符串是否为浮点数的 Python 方法:

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

此函数的更长更准确的名称可能是:is_convertible_to_float(value)

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

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,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

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

不要在生命攸关的软件上使用此代码!

以这种方式捕获广泛的异常,杀死金丝雀并吞噬异常会产生一个很小的机会,即作为字符串的有效浮点数将返回 false。 float(…) 行代码可能由于与字符串内容无关的一千个原因中的任何一个而失败。但是,如果您正在使用 Python 之类的鸭式原型语言编写对生命至关重要的软件,那么您将遇到更大的问题。

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

所以 true 变为 1,我认为是从 C++ 继承的

我在 2014 年发布了这个答案。多年来,中文 4 的 UTF-8 字形一直在发生变化,这取决于 stackoverflow 开发人员如何在他们的 microsoft toolstack 上更改其字符编码方案。多年来,随着新的转换方案主张其新的意识形态,看到它翻转是一种好奇心。但是,是的,东方数字的任何 UTF-8 字形都不是 Python 浮点数。巴津加。

除了如此广泛的例外,怎么能如此赞成?

无法转换中间有空格的所有内容,例如 "- 12.3" 和 "45 e6"

此 except 子句应限制为 TypeError, ValueError

答3:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

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

implicit 混合浮点数/整数可能会导致细微的错误,因为在使用浮点数时可能会损失精度或导致浮点数/整数上的 / 运算符的不同结果。根据上下文,最好返回 int 或 float,而不是两者。

@JFSebastian您是完全正确的,但是有时您希望输入来指示它将是哪一个。让输入决定哪一个可以很好地使用鸭式打字。

您可以嵌套另一个 try 以在它不可转换为浮动时引发异常。

s = u'\u0000' 失败

@iBug 好主意!我建议将 ValueError 放入相应的 except 中:P

答4:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

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

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

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

这不是解决问题的好方法。它在 Python 2 中运行良好,但在 Python 3 中会发生以下情况:python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>> 为了澄清为什么这是一个问题,如果您希望它不考虑电话号码并且不假定它们是数学表达式,那么这种方法不适合您.

@royce3 是的,这是一个很好的观点,用户应该小心。该行为最初是为了解决复杂文字解析的一些问题而修改的。这可能是 ast.literal_eval 中的一个错误,并且已在 here 中讨论过。

@royce3 作为记录,在 Python 3 中,ast 不会再将该电话号码直接评估为 -2566。它在 Python 3.7 changelog 中:ast.literal_eval() 现在更严格了。不再允许任意数字的加减法。 (由 Serhiy Storchaka 在 bpo-31778 中提供)

答5:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

本地化和逗号

您应该考虑在数字的字符串表示中使用逗号的可能性,例如 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——欧洲号码约定

在 majority of countries of the world 中,逗号用于小数点而不是句点。在此使用法语语言环境的示例中,逗号被正确处理为小数点:

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

方法 locale.atoi 也可用,但参数应为整数。

当您知道是否应该返回 float 或 int 时,这似乎是一个理想的解决方案,但是只有在传递了 int 的情况下,如何才能让它返回 int 呢?例如,当我真正想要 1 时,x = '1'; locale.atof(x) 返回 1.0。

使用 Dino 的方法,我想答案应该是这样的:locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)

我建议使用上面的 Javier 方法(尝试包装 locale.atoi 并在异常情况下使用 locale.atof - 它可能更具可读性。

答6:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

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

注意:处理作为字符串传递的金额时要小心,因为某些国家/地区使用“,”作为小数分隔符

@Emile:我不会将“2e-3”称为“极端情况”。这个答案刚刚被打破。

@BenG 不要把钱当作浮动来操纵。那是自找麻烦。用十进制来赚钱! (但您对“,”的评论仍然有效且重要)

不要忘记“不是数字”(NaN)和 +/- 无穷大也是有效的浮点值。所以 float("nan") 是一个完全有效的浮点值,上面的答案根本无法捕捉到

很容易被 IP 地址破解 - 192.168.0.1;或"This is not a good approach. :)"

答7:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

答8:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

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

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

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

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

答9:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

在 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 前缀通过 the following literals 自动转换为整数。这些对 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 兼容

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

>>> 037
31

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

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

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

>>> 0o37
31

答10:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

这个问题似乎有点老了。但是让我建议一个函数 parseStr,它可以做类似的事情,即返回整数或浮点数,如果给定的 ASCII 字符串不能转换为它们中的任何一个,它就会原封不动地返回它。当然可以调整代码以仅执行您想要的操作:

   >>> import string
   >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
   ...                      int(x) or x.isalnum() and x or \
   ...                      len(set(string.punctuation).intersection(x)) == 1 and \
   ...                      x.count('.') == 1 and float(x) or x
   >>> parseStr('123')
   123
   >>> parseStr('123.3')
   123.3
   >>> parseStr('3HC1')
   '3HC1'
   >>> parseStr('12.e5')
   1200000.0
   >>> parseStr('12$5')
   '12$5'
   >>> parseStr('12.2.2')
   '12.2.2'

1e3 在 python 中是一个数字,但根据您的代码是一个字符串。

我更喜欢这个答案。

答11:

huntsbot.com – 高效赚钱,自由工作

float(“545.2222”) 和 int(float(“545.2222”))

如果您的字符串恰好是“0”或“0.0”,这将为您提供一个浮点对象,而不是它为其他有效数字提供的 int。

原文链接:https://www.huntsbot.com/qa/4l2w/how-do-i-parse-a-string-to-a-float-or-int?lang=zh_CN&from=csdn

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值