【问题标题】:Parse string to int, failing on underscores将字符串解析为 int,下划线失败
【发布时间】:2018-12-04 16:57:10
【问题描述】:

我刚刚发现int('1_34')不会因为PEP 515而抛出错误。但我希望它抛出一个错误。是否有更严格的方式将字符串解析为ints(以及floats)可以避免这种情况?

【问题讨论】:

    标签: python python-3.x string int


    【解决方案1】:

    您可以检查字符串是否包含下划线,如果包含则引发异常。

    这是一个例子:

    s = "1_34"
    if "_" in s:
        raise ValueError("string contains an underscore")
    else:
        x = int(s)
    

    对于s = "1_34",您将获得:

    ValueError: string contains an underscore
    

    对于s = "134",您将拥有x = 134

    【讨论】:

    • 谢谢!手动方式相当简单。没有可用的内置功能?
    • @gruszczy 不幸的是,我不这么认为。 int 的唯一参数是转换为 int 和要使用的基数。将它包装在一个函数中可能是最接近的事情
    【解决方案2】:
    def number(n):
        if n.isdigit():
            return int(n)
        elif n.count(".") == 1 and n.replace(".", "").isdigit():
            return float(n)
        else:
            raise ValueError("Not a number!")
    
    
    
    
    print(number("345"))
    print(number("34.5"))
    print(number("1_34"))
    

    Imo 这是最干净的方法。

    【讨论】:

      【解决方案3】:

      如果你想弄脏你的手,你可以用你自己的继承builtin

      class Int(int):
          def __init__(self, value):
              if '_' in value:
                  raise ValueError("PEP 515 revoked - underscores not allowed")
              else:
                  super().__init__()
      

      如果你真的对 PEP 515 没有用处,甚至可能会影响内置的 int

      int = Int
      # you can always back up the builtin first...
      # _int = int
      

      有些人可能不赞成这个答案...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多