为什么数字字符串比较会产生意外结果?
'10:' true
有人可以解释一下为什么上面例子中的结果是真的吗? 如果我只是比较’1:’和’2:’我会得到预期的结果:
'1:' true
字符串逐字符进行比较。
比较1:
vs 2:
,比较从2
vs 1
开始,比较在那里停止并带有预期结果。
当你比较1:
vs 10:
,比较从1
对1
开始,并且由于它是平局,比较将继续进行下一次比较,即:
vs 0
,并且比较在那里停止,结果是你有发现令人惊讶(假设您希望比较字符串中的整数)。
要进行预期的比较,请使用to_i
将两个操作数转换为整数。
它是ASCII中的字符比较。
'10:' < '1:'
是(49 < 49) || (48 < 58) || (58 < ?)
(49 < 49) || (48 < 58) || (58 < ?)
#=> true
'1:' < '2:'
是(49 < 50) || (58 < 58)
(49 < 50) || (58 < 58)
#=> true
使用从左到右的布尔检查,并检查断点,其中找到了true。
注意:这只是我对各种示例模式的观察。
两个字符串中每个字符串的第一个字符是相同的。 正如Dave在评论中所说,第一个字符’0’的第二个字符小于’:’,所以第一个字符串小于第二个字符串。
因为0
的ASCII码是48,它小于:
的ASCII码,即58。