2015-10-12 32 views
1

我在ruby控制台中得到了以下输出。为什么`Integer('009')'不起作用,但是'Float('009')'呢?

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

但是,如果我尝试将相同的字符串转换为Float,它的工作原理。

Float('009') # => 9.0 

为什么Float转换这一点的同时Integer不?

+1

的可能的复制[如何在整数前导零工作( http://stackoverflow.com/questions/28545559/how-to-work-with-leading-zeros-in-integers) –

+0

这个答案处理整数解析在各种基地(在这种情况下,八进制)。浮动总是在基本10中表示,因此不会出现这种行为。 –

回答

10

Kernel#Integer解释开始领先0为八进制参数。由于octal number system使用数字0-7,包含9的号码未定义。从文档:

如果参数arg是一个字符串,当碱基被忽略或等于零时,基数指示符(0,0b和0x)被兑现。

Kernel#Float另一方面,并​​不表现如此。


要使用Integer"009"转换为整数以10为基数,你需要通过一个可选的参数指定基地:

Integer("009", 10) 
5

作为每docs

参数设置为整​​数值转换。如果参数是字符串, 并恰好以0x,0b,0开头,则分别将其解释为十六进制,二进制, 八进制字符串。

由于009被解释为八进制,因此出现错误。

或者你也可以这样做:

'009'.to_i 
#=> 9 
相关问题