将Ruby数组转换为Fixnum

3

我在研究时未能找到相关信息。我的基本目标是将一个数组转换为一个固定数字,例如 [5, 1, 7 ,8] 转换为值为 5178 的 fixnum。

3个回答

10

按照以下步骤执行:

 => [5, 1, 7 ,8].join.to_f
 => # 5178.0

这也可以工作:

 => [1,2,3,4].join.to_i
 => # 1234

哦,我明白了。我尝试使用to_i,但是出现了“没有方法”的错误。 - Stanimirovv

9
[5, 1, 7 ,8].inject{|n, d| n * 10 + d}
# => 5178

比较

t = Time.now
100000.times do
  [5, 1, 7 ,8].inject{|n, d| n * 10 + d}
end
Time.now - t # => 0.108719628

t = Time.now
100000.times do
  [5, 1, 7, 8].join.to_i
end
Time.now - t # => 0.246565502

2
因为它不生成中间字符串,而是直接在数字内进行计算。在我看来,按照其定义直接计算十进制数字要比将数字转换为字符串再解析为数字更加简单明了。 - sawa
@sawa 很好。谢谢。 - Alok Anand
1
@sawa 我想建议一个小修改,即使用 .inject(0),这会增加起始结果值的可读性。 [5, 1, 7 ,8].inject(0){|n, d| n * 10 + d} - Alok Anand
@sawa 我们也可以使用benchmark进行比较,你可能已经知道了,但请看这里。require 'benchmark' arr = [5,1,7,8] Benchmark.bm do |x| x.report { arr.join.to_i } x.report { arr.inject(0){|result, ele_val| result * 10 + ele_val} } end用户 系统 总共 实际 0.000000 0.000000 0.000000 ( 0.000015) 0.000000 0.000000 0.000000 ( 0.000009) - Alok Anand
我已经点赞了,即使第一行有一个逗号错位。 - Cary Swoveland

1
arr = [5, 1, 7 ,8]
arr.join.to_i

1.9.2-p320 :011 > arr = [5, 1, 7 ,8] => [5, 1, 7, 8] 1.9.2-p320 :012 > arr.join.to_i => 5178 - Alok Anand

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