2010-05-07 11 views
7

Estoy importar datos desde un archivo CSV, tengo que echar a algunos valores BigDecimal, y generará un error si no pueden ser analizados ..¿Cómo puedo saber si un BigDecimal no pudo analizar?

De las pruebas, BigDecimal ("número no válido") devuelve un BigDecimal 0. Esto estaría bien, pero un poco desordenado, excepto un valor válido es de 0 ...

flotador ("número no válido") actúa de forma diferente y se produce una excepción ...

Mi solución actual es :

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

Estoy totalmente perdido s ¿omething?

+0

Estoy de acuerdo con usted, esto es loco e incoherente. – jcollum

Respuesta

2

en el caso simple que puede utilizar RegExp

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

que no era realmente mi pregunta, puedo pensar en varias formas de validarlo, pero ¿por qué BigDecimal no actúa como los otros tipos al analizar cadenas –

+0

de la documentación: "El valor inicial, como una cadena. Los espacios se ignoran, no se reconocen los caracteres terminan el valor ". Entonces, es una característica – andrykonchin

+6

@aaz vamos, ¿por qué no reconocer que es una inconsistencia calva? BigDecimal.new puede tener ese comportamiento, seguro. Pero ¿por qué BigDecimal ("blah") no plantea un ArgumentError para que coincida con el comportamiento de Integer y Float? –

2

me encontré con este comportamiento incoherente en la actualidad.

Un enfoque:

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

o una versión más robusta:

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 
Cuestiones relacionadas