题
在ruby中,我使用以下格式解析日期:24092008。 我想将每个部分(年,月,日)转换为数字。
我使用正则表达式将它们拆分,它产生三个字符串,我将它传递给Integer构造函数。
date =~ /^([\d]{2})([\d]{2})([\d]{4})/
year = Integer($3)
month = Integer($2)
day = Integer($1)
当它击中月线时,崩溃如下:
`Integer': invalid value for Integer: "09" (ArgumentError)
我花了一段时间才意识到它正在解释前导零,因为Octal和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
但看起来.to_i没有相同的问题:
irb(main):005:0> "04".to_i
=> 4
irb(main):006:0> "09".to_i
=> 9
其他提示
指定基数10
明确告诉Ruby您要将字符串解释为基数为10的数字。
Integer("09", 10) # => 9
如果您想要严格>, .to_i
"123abc".to_i # => 123
Integer("123abc", 10) # => ArgumentError
我怎么想出来
在 irb
中,方法(:整数)
返回#&lt; Method:Object(Kernel)#Integer&gt;
。那告诉我 Kernel
拥有这个方法,我查阅了内核上的文档。 方法签名表明它需要一个base作为第二个参数。
或许(0([\ d])|([1-9] [\ d]))
代替([\ d] {2})
您可能需要使用2美元,4美元和5美元来代替1美元,2美元,3美元。
或者如果你的正则表达式支持(?:...)
,那么使用(?:0([\ d])|([1-9] [\ d])) 代码>
由于ruby从perl获取其正则表达式,后一版本应该可以工作。
不隶属于 StackOverflow