Как я узнаю, что BigDecimal не удалось разобрать? - PullRequest
7 голосов
/ 07 мая 2010

Я импортирую данные из csv, мне нужно преобразовать некоторые значения в BigDecimal и вызвать ошибку, если они не могут быть проанализированы ..

В результате тестирования BigDecimal («недопустимое число») возвращает BigDecimal, равный 0. Это было бы хорошо, но немного грязно, за исключением допустимого значения 0 ...

Float («неверное число») действует по-разному и выдает исключение ...

Мое текущее решение:

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

Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 04 октября 2012

Сегодня я столкнулся с этим непоследовательным поведением.

Один подход:

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
2 голосов
/ 07 мая 2010

в простом случае вы можете использовать RegExp

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