如何使用整数中的前导零

时间:2015-02-16 16:06:36

标签: ruby string integer octal

在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 个答案:

答案 0 :(得分:10)

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 :(得分:4)

你不能,因为Ruby的Integer类不存储前导零。

数字文字中的前导0被解释为前缀:

  • 00o:八进制数
  • 0x:十六进制数
  • 0b:二进制数
  • 0d:十进制数

它允许您在这些基础中输入数字。 Ruby的解析器将文字转换为适当的Integer实例。前缀或前导零被丢弃。

另一个例子是%w用于输入数组:

ary = %w(foo bar baz)
#=> ["foo", "bar", "baz"]

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

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