Ruby 如何从可能有前导零的字符串中解析数字?
在ruby中,我用以下格式解析一个日期:24092008。 我想将每个部分(年、月、日)转换成一个数字 我使用一个正则表达式将它们拆分,该正则表达式生成三个字符串,并将其传递到整数构造函数中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
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方法是最好的