为什么 `Integer('009')` 不起作用,而 `Float('009')` 起作用?
Why does `Integer('009')` not work, but `Float('009')` does?
我在 ruby 控制台中得到以下输出。
Integer('009') # => ArgumentError: invalid value for Integer(): "009"
但如果我尝试将相同的字符串转换为 Float
,它会起作用。
Float('009') # => 9.0
为什么 Float
转换这个而 Integer
不转换?
根据docs
Converts the argument to the integer value. If the argument is string,
and happen to start with 0x, 0b, 0, interprets it as hex, binary,
octal string respectively.
由于 009
被解释为八进制,因此您会遇到错误。
或者你也可以这样做:
'009'.to_i
#=> 9
Kernel#Integer interprets arguments starting with a leading 0
as octal. Because the octal number system 仅使用数字 0-7
,未定义包含 9
的数字。来自文档:
If arg is a String, when base is omitted or equals zero, radix indicators (0, 0b, and 0x) are honored.
另一方面,Kernel#Float 不会这样做。
要使用 Integer
将 "009"
转换为以 10 为基数的整数,您需要传递一个指定基数的可选参数:
Integer("009", 10)
我在 ruby 控制台中得到以下输出。
Integer('009') # => ArgumentError: invalid value for Integer(): "009"
但如果我尝试将相同的字符串转换为 Float
,它会起作用。
Float('009') # => 9.0
为什么 Float
转换这个而 Integer
不转换?
根据docs
Converts the argument to the integer value. If the argument is string, and happen to start with 0x, 0b, 0, interprets it as hex, binary, octal string respectively.
由于 009
被解释为八进制,因此您会遇到错误。
或者你也可以这样做:
'009'.to_i
#=> 9
Kernel#Integer interprets arguments starting with a leading 0
as octal. Because the octal number system 仅使用数字 0-7
,未定义包含 9
的数字。来自文档:
另一方面,If arg is a String, when base is omitted or equals zero, radix indicators (0, 0b, and 0x) are honored.
Kernel#Float 不会这样做。
要使用 Integer
将 "009"
转换为以 10 为基数的整数,您需要传递一个指定基数的可选参数:
Integer("009", 10)