在 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
开头的数字字面量是八进制表示,除以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"
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
Integer
类不能存储前导零。 - Stefan0123
转换成了83
。你无法以八进制字面值的方式访问它们并将它们视为除了整数之外的任何类型,这时你想要的已经晚了。相反,你必须使用某种形式的字符串表示,它不会被转换。例如,'0123'.reverse # => "3210"
。 - the Tin Man
the_string_object.reverse
(除非您是指对数字进行排序)。 - falsetru0112 == 74 == 0x4a == 0b1001010
。你最好使用字符串而不是数字。 - falsetru