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

Ruby 如何从可能有前导零的字符串中解析数字?,ruby,string,date,types,Ruby,String,Date,Types,在ruby中,我用以下格式解析一个日期:24092008。 我想将每个部分(年、月、日)转换成一个数字 我使用一个正则表达式将它们拆分,该正则表达式生成三个字符串,并将其传递到整数构造函数中 date =~ /^([\d]{2})([\d]{2})([\d]{4})/ year = Integer($3) month = Integer($2) day = Integer($1) 当它到达月线时,它崩溃如下: `Integer': invalid value for Integ

在ruby中,我用以下格式解析一个日期:24092008。 我想将每个部分(年、月、日)转换成一个数字

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

  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美元、2美元和1美元是字符串。以下是我在IRB中为复制问题所做的工作:

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
也许是
(0([\d])|([1-9][\d]))
代替了
([\d]{2})
您可能需要使用$2、$4和$5来代替$1、$2、$3

或者如果您的regexp支持
(?:…)
,则使用
(?:0([\d])|([1-9][\d]))

由于ruby的regexp来自perl,因此后一个版本应该可以使用。

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

Integer("09", 10) # => 9
如果你想严格些,这比
.to_i
要好

"123abc".to_i # => 123
Integer("123abc", 10) # => ArgumentError
我怎么知道的
irb
中,
方法(:Integer)
返回
。这告诉我
Kernel
拥有这个方法,我查阅了关于Kernel的文档。显示它以基数作为第二个参数。

@Atiaxi:抛出“无效值”,因为“09”不是有效的八进制数。前导零通常表示它是八进制的,0-7是八进制的有效数字:obj.to_i转换为以10为基数。
String#to_i
将忽略尾随的非数字字符<代码>“123abc”。to#i=>123。这可能不可取,您可以在Ruby 1.9中显式指定base-10:
Integer(“09”,10)#=>9
,这里的问题是现在有太多匹配项。根据接吻原则,我认为在这种情况下,to_I方法是最好的