为什么`Integer(' 009')`不起作用,但`Float(' 009')`呢?

时间:2015-10-12 07:56:45

标签: ruby literals

我在ruby控制台中获得了以下输出。

Integer('009') # => ArgumentError: invalid value for Integer(): "009"

但是如果我尝试将相同的字符串转换为Float,它就可以了。

Float('009') # => 9.0 

为什么Float转换此内容而Integer没有?

2 个答案:

答案 0 :(得分:10)

unmanaged extension将以前导0开头的参数解释为八进制。由于Kernel#Integer ony使用数字0-7,因此未定义包含9的数字。来自文档:

  

如果arg是一个String,当省略base或等于零时,将遵循基数指示符(0,0b和0x)。

另一方面,

octal number system不会这样做。

要使用"009"Integer转换为基数为10的整数,您需要传递一个指定基数的可选参数:

Integer("009", 10)

答案 1 :(得分:5)

根据docs

  

将参数转换为整数值。如果参数是字符串,   并碰巧以0x,0b,0开头,将其解释为十六进制,二进制,   八进制字符串。

由于009被解释为八进制,因此您收到错误。

或者您也可以这样做:

'009'.to_i
#=> 9