ruby 中数字和字符串的比较
Comparisons on numbers and strings in ruby
在控制台中:
1.9.3p547 :010 > my_s = 00013.to_s
=> "11"
1.9.3p547 :011 > my_s = 00013.to_i
=> 11
1.9.3p547 :012 > 13.to_s
=> "13"
1.9.3p547 :013 > 13.to_i
=> 13
为什么会有这种待遇差异?如何比较本质上是数字但已用零填充的字符串值?
在 Ruby 的 Integer
class 中,不存储前导零。
前导零是数字字面量,并像这样解释
Octal
: 0, 0o
Hexadecimal
: 0, 0x
Binary
: 0b
Decimal
: 0d
'00013' 有三个前导零,并且匹配格式 0o
。 IRB 将这些数字视为八进制(基数 8)
您用前导零写了 00013
。在 Ruby(以及许多其他语言)中,以零开头的整数文字被视为八进制(以 8 为底),因此您键入的数字(以十进制表示)实际上是 8 + 3 = 11。
回答你问题的第二部分:如果你有一个像 '00013'
这样的字符串,你可以只调用 #to_i
并且 Ruby 实际上会将它转换为 13 (十进制)。这样您就可以进行比较了。
您的示例中没有任何 "string values that are fundamentally numbers but that have been padded with zeros"。如果你这样做了,它实际上会按照你的预期工作:
"00013".to_i
# => 13
您的示例中有一个用零填充的数字文字。正如其他答案所说,ruby 将其视为八进制表示。
但如果您实际上有一个数字的字符串表示形式,用零填充,它工作正常,只需调用 #to_i 即可。
在控制台中:
1.9.3p547 :010 > my_s = 00013.to_s
=> "11"
1.9.3p547 :011 > my_s = 00013.to_i
=> 11
1.9.3p547 :012 > 13.to_s
=> "13"
1.9.3p547 :013 > 13.to_i
=> 13
为什么会有这种待遇差异?如何比较本质上是数字但已用零填充的字符串值?
在 Ruby 的 Integer
class 中,不存储前导零。
前导零是数字字面量,并像这样解释
Octal
: 0, 0o
Hexadecimal
: 0, 0x
Binary
: 0b
Decimal
: 0d
'00013' 有三个前导零,并且匹配格式 0o
。 IRB 将这些数字视为八进制(基数 8)
您用前导零写了 00013
。在 Ruby(以及许多其他语言)中,以零开头的整数文字被视为八进制(以 8 为底),因此您键入的数字(以十进制表示)实际上是 8 + 3 = 11。
回答你问题的第二部分:如果你有一个像 '00013'
这样的字符串,你可以只调用 #to_i
并且 Ruby 实际上会将它转换为 13 (十进制)。这样您就可以进行比较了。
您的示例中没有任何 "string values that are fundamentally numbers but that have been padded with zeros"。如果你这样做了,它实际上会按照你的预期工作:
"00013".to_i
# => 13
您的示例中有一个用零填充的数字文字。正如其他答案所说,ruby 将其视为八进制表示。
但如果您实际上有一个数字的字符串表示形式,用零填充,它工作正常,只需调用 #to_i 即可。