【问题标题】:Ruby Kata Integer conversion troubleshoot [duplicate]Ruby Kata 整数转换疑难解答 [重复]
【发布时间】:2014-06-05 19:09:20
【问题描述】:

我正在解决这个 ruby​​ kata。本质上,代码所做的是输出一个五位数的整数。 示例:

5 = 00005
12 = 00012
12345 = 12345
00001234 = 012345

这是我的代码:

def solution(value) #00001204
  string_value = value.to_s
  if string_value.length <= 5
    amount_of_zeros = "0" * (string_value.length - 5).abs
    puts "Value is #{amount_of_zeros}" + "#{string_value}"
  else
    start_of_characters = 5 - string_value.length  #-3
    puts "Value is " +  string_value[-1..start_of_characters]
  end
end

在我放置 00001204 之前一切正常。出于某种原因,我得到了输出00644。我尝试使用binding.pry 来查看发生了什么,我的号码从一开始就被转换为644。为什么这样做?文档没有提到任何关于它的内容。我不知道如何解决这个问题,因为在我方法的第一行它已经变成了644。有什么想法吗?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    在 ruby​​ 中,以 0 为前缀的数字被解释为八进制。当您将 00001204 传递给您的方法时,ruby 假设您希望将数字解释为八进制。 12048 = 64410.

    644.to_s 8 
    => "1204"
    01204.to_s 10
    => "644"
    

    查看文字上的Ruby documentation

    【讨论】:

    • 谢谢@Zajn。 Ruby 不会碰巧有将八进制转换为十进制的方法吧?
    • 您可以使用to_s(base),其中base 是您要转换为的数字基数。所以01204.to_s(10) 会产生"644"
    • 许多 语言中,以 0 为前缀的数字被视为八进制。这不仅限于 Ruby。 0x08 # =&gt; 8010 # =&gt; 88 # =&gt; 80b00001000 # =&gt; 8,分别是同一个数8的十六进制、八进制、十进制和二进制表示。
    【解决方案2】:

    正如 Zajn 所说,这是因为它被解释为八进制。

    您也可以使用.to_i 将其强制为整数。

    >> 000000001204
    => 644
    >> "000000001204".to_i
    => 1204
    

    如果你只是想输出它,还可以看看字符串格式化,因为它可以清理你的代码很多

    >> "%05d" % "000001204".to_i
    => "01204"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多