2

我正在验证一些地理空间数据,我需要将其他数据类型强制转换为 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

有人对此有更强大的解决方案吗?我正在使用 ruby​​2.0.0-p0 来获得它的价值。

4

1 回答 1

1

在控制台进行大量修改后,我确定正则表达式确实是唯一的出路。我想知道BigDecimal这种行为是否是疏忽,或者有一些我不知道的非常好的理由。

于 2013-04-12T18:31:20.677 回答