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

时间:2008-09-28 20:30:36

标签: ruby string date types

在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 个答案:

答案 0 :(得分:15)

我不熟悉正则表达式,所以如果这个答案偏离基础,请原谅我。我一直认为$ 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

答案 1 :(得分:6)

指定基数10

明确告诉Ruby您要将字符串解释为基数为10的数字。

 with open ('abc.xml' , "r+") as f:
     for line in f:
         if '</subtag>' in line:
             f.write('\n text1\n')
             f.write('text2')
             f.write('text3')

如果您想要严格,优于Integer("09", 10) # => 9

.to_i

我怎么想出来

"123abc".to_i # => 123 Integer("123abc", 10) # => ArgumentError irb返回method(:Integer)。那告诉我#<Method: Object(Kernel)#Integer>拥有这个方法,我查阅了内核上的文档。 The method signature表明它需要一个基数作为第二个参数。

答案 2 :(得分:1)

或许(0([\d])|([1-9][\d]))取代([\d]{2}) 您可能需要使用2美元,4美元和5美元来代替1美元,2美元,3美元。

如果您的正则表达式支持(?:...),请使用(?:0([\d])|([1-9][\d]))

由于ruby从perl获取正则表达式,后一版本应该可以工作。