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

pat*_*ckS 1 ruby literals

我在ruby控制台中得到了以下输出.

Integer('009') # => ArgumentError: invalid value for Integer(): "009"
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将相同的字符串转换为Float,它可以工作.

Float('009') # => 9.0 
Run Code Online (Sandbox Code Playgroud)

为什么Float转换这个而Integer不是?

Dre*_*nmi 10

Kernel#Integer解释以前导0为八进制的参数.由于八进制数系统 ony使用数字0-7,9因此未定义包含a的数字.从文档:

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

另一方面,内核#Float不会以这种方式运行.


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

Integer("009", 10)
Run Code Online (Sandbox Code Playgroud)


shi*_*vam 5

按照文档

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

由于009被解释为八进制,您将收到错误.

或者您也可以这样做:

'009'.to_i
#=> 9
Run Code Online (Sandbox Code Playgroud)