如何将字符串转换为int或float优先级为int?

时间:2011-04-09 23:45:32

标签: python

当我想要这个时,我找不到另一个答案,所以我想我会为其他人发布我自己的解决方案,如果我做错了也会得到更正。

我必须制作一个自动配置文件解析器,如果可能的话我更喜欢将数字设为int,如果没有则优先浮动。通常的try / except转换本身不起作用,因为任何float都只会被强制转换为int。

为了澄清有人问,案例基本上是将数字转换为编写配置文件数据的人。所以带小数的任何东西都可能是浮点数。此外,由于浮点数的性质,我认为float对于某些运算符(例如==,<,>)可能是危险的,并且int将在必要时转换为float。因此,我希望数字尽可能保持在int中。这不是一件大事,只是对我自己的一种约定。

4 个答案:

答案 0 :(得分:23)

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

如果您希望将"10.0000"转换为int,请尝试以下操作:

def int_dammit_else_float(s):
    f = float(s)
    i = int(f)
    return i if i == f else f

您希望输入的结果如"1e25"

答案 1 :(得分:2)

这是有一段时间,获得许可可能比先后请求宽恕更好,这通常被认为是“Pythonic”做事的方式,通常涉及try/except。所以像这样简单的东西可能就足够了:

v = float(s) if '.' in s or 'e' in s.lower() else int(s) 

由于有多个字符可以指示浮点数,您还可以通过其他方式检查其中一个:

import re
pattern = re.compile(r'[.eE]')
v = float(s) if pattern.findall(s) else int(s)

chars = set('.eE')
v = float(s) if any((c in chars) for c in s) else int(s)

最后,在一个稍微不同的轨道上,如果你想要浮点整数成为整数,你可以做以下,这类似于@John Machin的“_dammit_”函数:

v = int(float(s)) if int(float(s)) == float(s) else float(s)

答案 2 :(得分:2)

def int_float_none(x):
    # it may be already int or float 
    if isinstance(x, (int, float)):
        return x
    # all int like strings can be converted to float so int tries first 
    try:
        return int(x)
    except (TypeError, ValueError):
        pass
    try:
        return float(x)
    except (TypeError, ValueError):
        return None

对于传递的任何对象,上面的函数将返回int或float转换或None。

答案 3 :(得分:0)

尝试检测浮点数并不容易,但检测可能的整数更容易。

我会尝试检查字符串是否只包含数字(忽略可能的前导空格或符号)并相应地转换为float或integer:

std::list::iterator

打印:

lst = ['1' , '2.2' , ' -3','+5']

result = [int(x) if x.lstrip(" -+").isdigit() else float(x) for x in lst]

print(result)