2015-03-02 121 views
0

数字和字符串在控制台:比较在红宝石

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 

为什么在处理这种差异?如何在基本数字的字符串值之间进行比较,但用零填充?

回答

6

您写了00013,前导零。在Ruby(以及许多其他语言)中,以零开始的整数文字被视为八进制(基数为8),所以输入的数字(当以十进制写入时)实际上是8 + 3 = 11.

要回答你的问题的第二部分:如果你有一个像'00013'这样的字符串,你可以在它上面调用#to_i,Ruby实际上将它转换为13(十进制)。所以这应该让你进行比较。

+0

如果你想从'00013'获得''13“'',知道它是八进制的,你可以执行'00013.to_s(8)'。如果你想要一个int,那么你可以调用'to_i'。 – ptd 2015-03-02 17:07:19

+0

@ptd添加了一条最有用的评论。有一个数组,有些填充其他**不**,会应用'to_s(8)'对unpadded? – Jerome 2015-03-02 19:27:09

+0

@Jerome是的,它会有不良影响。如果你想知道会发生什么,你应该使用'irb'来看看自己。 – ptd 2015-03-02 19:37:09

0

在Ruby的Integer类中,不存储前导零。

前导零是数字面值和被解释,像这样

Octal:0,0°

Hexadecimal:0,0X

Binary:0B

Decimal:0D

'00013'有三个前导零,并且匹配格式0o。 IRB将这些数字视为八进制数(基数为8)

0

您的示例中没有任何“字符串值基本上是数字,但已用零填充”。如果你这样做,它实际上会如何工作:

"00013".to_i 
# => 13 

在你的例子中,你有一个数字字面值,用零填充。正如其他答案所说,这被视为ruby的八进制表示。

但是,如果你实际上有一个数字的字符串表示,用零填充,它可以正常工作,只需调用#to_i就可以了。