2013-03-25 45 views
2

我正在驗證一些地理空間數據,我需要將其他數據類型強制轉換爲BigDecimal。一般強制爲BigDecimal

我能得到最接近的是通過下面的代碼片段:

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

當然,to_d返回零無效的強制,使有效的零喜歡像數,結構測試失敗。不過,我不能在BigDecimal文檔中看到更好的方法。 (有一個BigDecimal#coerce方法並沒有真正有幫助usecases。)

# 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來表示它的價值。

+0

哇,一個巨大的不一致的PITA! Float('pancakes')引發異常,但BigDecimal('pancakes')返回零。 – 2013-03-26 02:26:44

+0

你有沒有想過這個?我想到了一個醜陋的「is_a?」,「respond_to?」,並且正則表達式可以達到您所能獲得的最佳效果。 – 2013-04-12 04:27:55

+0

我最終完成了一個正則表達式。我喜歡基於方法的做法,但沒有找到其他真正的選擇。 – 2013-04-12 14:13:11

回答

1

經過在控制檯上做了大量的修改之後,我確定了正則表達式真的是唯一的出路。我想知道BigDecimal這樣的行爲是否是疏忽,還是有一些我沒有意識到的很好的理由。