7

我正在从 csv 导入数据,我需要将一些值转换为 BigDecimal,如果它们无法解析,则会引发错误。

根据测试,BigDecimal("invalid number") 返回 0 的 BigDecimal。这没问题,但有点混乱,除了有效值为 0...

Float("invalid number") 行为不同并引发异常...

我目前的解决方案是:

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

我完全错过了什么吗?

4

2 回答 2

2

在简单的情况下,您可以使用 RegExp

'123.4' =~ /^[+-]{0,1}\d+\.{0,1}\d*$/
=> 0
于 2010-05-07T14:37:38.070 回答
1

我今天遇到了这种不一致的行为。

一种方法:

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
于 2012-10-04T09:26:35.453 回答