一般强制到BigDecimal

时间:2013-03-25 23:31:24

标签: ruby

我正在验证一些地理空间数据,我需要将其他数据类型强制转换为BigDecimal。

我最接近的是通过以下代码段:

def is_decimalizable?(coordinate)
  !coordinate.to_d.zero?
end

当然,对于无效强制,to_d返回零,这使得有效的类似数字的结构无法通过测试。但是,我无法在BigDecimal文档中看到更好的方法。 (有一个BigDecimal#coerce方法并没有真正记录有用的用例。)

# Good:
is_decimalizable?(-100)        #=> true
is_decimalizable?('-100')      #=> true
is_decimalizable?(-100.0)      #=> true
is_decimalizable?('-100.0')    #=> true
is_decimalizable?('-100.0lng') #=> true
bigd = BigDecimal.new('0.1')
is_decimalizable?(bigd)        #=> true

is_decimalizable?('asdf')      #=> false

# Bad:
is_decimalizable?(0)          #=> false
is_decimalizable?('0')        #=> false
is_decimalizable?(0.0)        #=> false
is_decimalizable?('0.0')      #=> false
is_decimalizable?('0.0lng')   #=> false
bigd = BigDecimal.new('0.0')
is_decimalizable?(bigd)       #=> false

任何人都有更强大的解决方案吗?我正在使用ruby2.0.0-p0来获取它的价值。

1 个答案:

答案 0 :(得分:1)

经过多次修补控制台,我已经确定正则表达式真的是唯一的出路。我想知道BigDecimal这种行为是否是一种疏忽,或者有一些我不了解的理由。