【问题标题】:Why do numeric string comparisons give unexpected results?为什么数字字符串比较会产生意想不到的结果?
【发布时间】:2019-02-06 02:43:56
【问题描述】:
'10:' < '1:'
# => true

有人能解释一下为什么上面例子中的结果是真的吗?如果我只是比较 '1:' 和 '2:' 我会得到预期的结果:

'1:' < '2:'
# => true

【问题讨论】:

标签: ruby string


【解决方案1】:

字符串逐个字符进行比较。

当您比较 1:2: 时,比较会从 21 开始,然后比较会以预期的结果停止。

当您比较1:10: 时,比较从11 开始,由于是平局,因此比较继续进行下一个比较,即: 与@987654330 @,然后比较停止,结果令人惊讶(假设您期望比较字符串中的整数)。

要进行您期望的比较,请使用to_i 将两个操作数都转换为整数。

【讨论】:

    【解决方案2】:

    在 ASCII 中逐个字符比较。

    '10:' &lt; '1:'(49 &lt; 49) || (48 &lt; 58) || (58 &lt; ?)

    #=> true
    

    '1:' &lt; '2:'(49 &lt; 50) || (58 &lt; 58)

    #=> true
    

    使用从左到右的布尔检查,并在找到 true 的地方进行检查。

    注意:这只是我对各种示例模式的观察。

    【讨论】:

      【解决方案3】:

      两个字符串的第一个字符相同。而且正如 Dave 在 cmets 中所说,第一个字符的第二个字符 '0' 小于 ':',所以第一个字符串小于第二个。

      【讨论】:

        【解决方案4】:

        因为0的ASCII码是48,小于:的ASCII码58。

        【讨论】:

          猜你喜欢
          • 2015-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-03
          相关资源
          最近更新 更多