2010-05-07 2 views
7

, 나는 BigDecimal를 몇 가지 값을 캐스팅하고 구문 분석 할 수없는 경우 오류가 발생합니다 .. 시험에서BigDecimal의 구문 분석에 실패했는지 어떻게 알 수 있습니까? 나는 CSV에서 데이터를 가져 오는거야

, BigDecimal를 ("잘못된 수") 인 BigDecimal를 돌려줍니다 유효한 값이 0을 제외하고 0의이

나의 현재 솔루션 ("잘못된 번호") 다른 역할을하며 예외가 발생

플로트입니다 ... ..., 좋아,하지만 좀 지저분한 것 :

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

뭔가?

+0

,이 엉뚱한와 일치하지 않습니다. – jcollum

답변

2

간단한 경우에 당신은 내가 오늘이 일치하지 않는 행동을 통해 온 정규식

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

그게 정말 내 질문이 아니었다, 나는 그것을 검증하는 몇 가지 방법을 생각할 수 있지만 BigDecimal 문자열을 구문 분석 할 때 다른 형식으로 작동하지 않습니다 –

+0

설명서에서 : "초기 값, 문자열로. 공백은 무시되고, 인식 할 수 없습니다. 문자가 값을 종료합니다. " 그래서, 그 특징은 – andrykonchin

+6

@aaz가옵니다. 왜 그것이 대머리가 된 불일치라는 것을 인정하지 않습니까? BigDecimal.new는 그 동작을 가질 수 있습니다. 하지만 BigDecimal ("blah")가 Integer 및 Float의 비헤비어와 일치하도록 ArgumentError를 발생시키지 않는 이유는 무엇입니까? –

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 
관련 문제