如何处理整数中的前导零

10

在 Ruby 中,处理前导零的正确方式是什么?

0112.to_s
 => "74"
0112.to_i
 => 74
为什么会将0112转换成74
如何将0112转换为字符串"0112"
我想定义一个接受整数参数并按其数字降序排列后返回的方法。
但是当我有前导零时,这似乎对我不起作用:
def descending_order(n)
  n.to_s.reverse.to_i
end
2个回答

14

0开头的数字字面量是八进制表示,除以0x开头的字面量表示十六进制数或以0b开头的字面量表示二进制数。

1 * 8**2 + 1 * 8**1 + 2 * 8**0 == 74

要将其转换为0112,请使用适当的格式字符串与String#%Kernel#sprintf

'0%o' % 0112  # 0: leading zero, %o: represent as an octal
# => "0112"

1
那真是快速而且非常准确! - Anthony
@falsetru 谢谢您的快速回复。如果我想编写一个方法来将数字按降序排列,我该如何考虑这个问题? - Joel
1
@JoelL,根据您的需求,您可以简单地使用the_string_object.reverse(除非您是指对数字进行排序)。 - falsetru
@JoelL,请重新阅读我的回答。0112 == 74 == 0x4a == 0b1001010。你最好使用字符串而不是数字。 - falsetru
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/71037/discussion-between-joell-and-falsetru。 - Joel
显示剩余6条评论

7
由于 Ruby 的 Integer 类没有存储前导零的功能,所以您无法存储前导零。
数字字面量中的前导 0 被解释为前缀:
- 0 和 0o:八进制数 - 0x:十六进制数 - 0b:二进制数 - 0d:十进制数
它允许您在这些进制中“输入”数字。Ruby 解析器将字面量转换为适当的整数实例。这些前缀或前导零将被丢弃。
另一个示例是用于输入数组的 %w。
ary = %w(foo bar baz)
#=> ["foo", "bar", "baz"]

无法从ary获取%w,解析器将文字转换为数组实例,因此脚本永远不会看到文字。

0112(或0o112)被解析器解释为八进制数112并转换为整数74

在十进制中,无论前面有多少个零,0112都只是112

0d0112   #=> 112
0d00112  #=> 112
0d000112 #=> 112

这就像是浮点数的额外尾随零:

1.0   #=> 1.0
1.00  #=> 1.0
1.000 #=> 1.0

您可能需要使用字符串,即"0112"

另一种选择是显式提供(最小)宽度,例如:

def descending_order(number, width = 0)
  sprintf('%0*d', width, number).reverse.to_i
end

descending_order(123, 4)
#=> 3210

descending_order(123, 10)
#=> 3210000000

@Stefan 谢谢您的回复。是否有可能定义一个方法,它接受任何整数,并仅以降序返回数字,而不知道它包含多少位数? - Joel
@JoelL 不,反转 321000 得到的是 123,零被丢失了。Ruby 的 Integer 类不能存储前导零。 - Stefan
啊,是的,字面值和整数之间肯定有区别。 - the Tin Man
2
@JoelL,我认为你没有理解的是Ruby在脚本控制之前就把0123转换成了83。你无法以八进制字面值的方式访问它们并将它们视为除了整数之外的任何类型,这时你想要的已经晚了。相反,你必须使用某种形式的字符串表示,它不会被转换。例如,'0123'.reverse # => "3210" - the Tin Man
@theTinMan 那很有道理。谢谢你 - Joel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接