2010-05-07 40 views
7

我從CSV導入數據,我需要投一些價值爲BigDecimal,並引發一個錯誤,如果他們不能被解析..如何知道BigDecimal是否無法解析?

從測試的BigDecimal(「無效號碼」)返回一個BigDecimal 0。這將是確定的,但那種凌亂,除了有效值爲0 ...

浮動(「無效號碼」)的行爲不同,拋出一個異常...

我目前的解決方案是:

class String 
    def to_bd 
    begin 
     Float(self) 
    rescue 
     raise "Unable to parse: #{self}" 
    end 
    BigDecimal(self) 
    end 
end 

我完全錯過了嗎? omething?

+0

我同意你的看法,這是古怪和不一致。 – jcollum 2011-11-25 17:52:34

回答

2

在簡單的情況下,你可以使用正則表達式

'123.4' =~ /^[+-]{0,1}\d+\.{0,1}\d*$/ 
=> 0 
+0

這真的不是我的問題,我可以想出幾種方法來驗證它,但爲什麼BigDecimal在從文檔解析字符串 – 2010-05-07 14:47:28

+0

時不像其他類型:「初始值,作爲字符串。空格被忽略,無法識別字符終止值「。所以,它的一個功能 – andrykonchin 2010-05-07 17:39:03

+6

@aaz來吧,爲什麼不承認這是一個禿子不一致? BigDecimal.new可以有這種行爲,當然。但爲什麼BigDecimal(「blah」)不會引發ArgumentError來匹配Integer和Float的行爲? – 2011-10-24 21:54:56

2

我今天碰到這個不一致的行爲來。

一種方法:

def StrictDecimal(arg) 
    Float(arg) 
    BigDecimal(arg) 
end 

或者更強大的版本:

def StrictDecimal(value) 
    if value.is_a?(Float) 
    fail ArgumentError, "innacurate float for StrictDecimal(): #{amount}" 
    end 
    Float(value) 
    BigDecimal(value) 
rescue TypeError 
    fail ArgumentError, "invalid value for StrictDecimal(): #{amount}" 
end