7

csv からデータをインポートしています。いくつかの値を BigDecimal にキャストし、解析できない場合はエラーを発生させる必要があります。

テストから、BigDecimal("invalid number") は 0 の BigDecimal を返します。

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

今日、この一貫性のない動作に遭遇しました。

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 に答える