代码之家  ›  专栏  ›  技术社区  ›  Darren Greaves

如何从可能有前导零的字符串中解析数字?

  •  7
  • Darren Greaves  · 技术社区  · 17 年前

    我想将每个部分(年、月、日)转换成一个数字。

    我使用一个正则表达式将它们拆分,该正则表达式生成三个字符串,并将其传递到整数构造函数中。

      date =~ /^([\d]{2})([\d]{2})([\d]{4})/
      year = Integer($3)
      month = Integer($2)
      day = Integer($1)
    

    `Integer': invalid value for Integer: "09" (ArgumentError)
    

    我花了一段时间才意识到,它将前导零解释为八进制,而09不是一个有效的八进制数(它可以与“07”配合使用)。

    是否有一个优雅的解决方案,或者我应该只测试小于10的数字,然后先去掉零?

    谢谢

    3 回复  |  直到 17 年前
        1
  •  15
  •   Atiaxi    17 年前

    irb(main):003:0> Integer("04")
    => 4
    irb(main):004:0> Integer("09")
    ArgumentError: invalid value for Integer: "09"
        from (irb):4:in `Integer'
        from (irb):4
        from :0
    

    但看起来,我没有同样的问题:

    irb(main):005:0> "04".to_i
    => 4
    irb(main):006:0> "09".to_i
    => 9
    
        2
  •  6
  •   Nathan Long    9 年前

    明确地告诉Ruby您希望将字符串解释为以10为基数的数字。

    Integer("09", 10) # => 9
    

    这是 .to_i 如果你想严格点 .

    "123abc".to_i # => 123
    Integer("123abc", 10) # => ArgumentError
    

    我怎么知道的

    irb , method(:Integer) 返回 #<Method: Object(Kernel)#Integer> . 这告诉我 Kernel The method signature

        3
  •  1
  •   Jamie    17 年前

    可能 (0([\d])|([1-9][\d])) 代替 ([\d]{2})

    或者如果您的regexp支持 (?:...) (?:0([\d])|([1-9][\d]))