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 即可。