如何划分来自OCI8记录集的bigdecimal对象?

时间:2013-08-05 18:06:43

标签: ruby bigdecimal oci8

def main()

  myDB=DB.new('myUser','myPass','myDB')
  record = myDB.handle().select_one('select count(*) from things')
  printf "%10d" % record

end

main()的 结果: 30008428

我想将此值除以24以创建将每小时执行的批次。 这是漂亮的打印结果:

[#<BigDecimal:ac2fdf94,'0.30008428E8',8(12)>]

我对如何实现这一点非常困惑。 据我所知,“record”是一个包含BigDecimal对象的数组。 我试着这样做 记录[0] .div(24)也不起作用。 record.div(24)也没有用。

由于我现在花了很多时间搞清楚,我觉得我需要转向社区寻求一些帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

DBI::Handle#select_one方法(我想象的是必须隐藏在DB模块后面的方法)从数据库中返回一条记录。因为这一条记录可能包含多个字段,所以它将记录作为数组返回。在这种情况下,只有一列 - 计数 - 因此计数值在record[0]

我想通过“漂亮的打印”你的意思是来自p record的输出,它是调试输出而不仅仅是漂亮的打印。它相当于puts record.inspect。在这种情况下,它会在数组(#<...>)中显示单个对象([...]内的所有内容)。

对于BigDecimal个对象,inspect返回一个字符串,给出类名 BigDecimal ;十六进制的地址, ac2fdf94 ;当前值为字符串, 0.30008428E8 ;以及当前(最大)有效数字 8(12)

你的问题的简短回答是你可能想写

count = record[0].to_i

然后使用count,这是正常Fixnum,因此您的部门看起来像

per_hour = count / 24.0

值30,008,428在最大Fixnum值范围内,这取决于您的机器字大小,但可能是2 30 或超过10亿。即使你超过了这个值,Ruby也会 - 大多数是默默地 - 为你转换为Bignum,所以不会发生任何不好的事情。