数字和字符串在控制台:比较在红宝石
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
为什么在处理这种差异?如何在基本数字的字符串值之间进行比较,但用零填充?
数字和字符串在控制台:比较在红宝石
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
为什么在处理这种差异?如何在基本数字的字符串值之间进行比较,但用零填充?
您写了00013
,前导零。在Ruby(以及许多其他语言)中,以零开始的整数文字被视为八进制(基数为8),所以输入的数字(当以十进制写入时)实际上是8 + 3 = 11.
要回答你的问题的第二部分:如果你有一个像'00013'
这样的字符串,你可以在它上面调用#to_i
,Ruby实际上将它转换为13(十进制)。所以这应该让你进行比较。
在Ruby的Integer
类中,不存储前导零。
前导零是数字面值和被解释,像这样
Octal
:0,0°
Hexadecimal
:0,0X
Binary
:0B
Decimal
:0D
'00013'有三个前导零,并且匹配格式0o
。 IRB将这些数字视为八进制数(基数为8)
您的示例中没有任何“字符串值基本上是数字,但已用零填充”。如果你这样做,它实际上会如何工作:
"00013".to_i
# => 13
在你的例子中,你有一个数字字面值,用零填充。正如其他答案所说,这被视为ruby的八进制表示。
但是,如果你实际上有一个数字的字符串表示,用零填充,它可以正常工作,只需调用#to_i就可以了。
如果你想从'00013'获得''13“'',知道它是八进制的,你可以执行'00013.to_s(8)'。如果你想要一个int,那么你可以调用'to_i'。 – ptd 2015-03-02 17:07:19
@ptd添加了一条最有用的评论。有一个数组,有些填充其他**不**,会应用'to_s(8)'对unpadded? – Jerome 2015-03-02 19:27:09
@Jerome是的,它会有不良影响。如果你想知道会发生什么,你应该使用'irb'来看看自己。 – ptd 2015-03-02 19:37:09