如何使用整数中的前导零

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

0112.to_s => "74" 0112.to_i => 74 

为什么将0112转换为74

如何将0112转换为字符串"0112"


我想定义一个方法,它以整数作为参数,并以数字的降序返回它。

但是当我有前导零时,这对我来说似乎不起作用:

 def descending_order(n) n.to_s.reverse.to_i end 

0开头的数字文字是八进制表示forms,除了以0x的文字表示hex数字或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" 

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

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

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

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

另一个例子是输入数组的%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