2016-09-19 5 views
1

Ich habe einen reinen String-Wert, der aus einem API-Aufruf wurde erhalten und wird in einer Datenbank als String gespeichert:BigDecimal String Währung

#<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)> 

Das muss irgendwie in einen Währungswert umgewandelt werden.

Ich würde erwarten, dass so etwas funktioniert, aber es gibt nur als Null zurück.

v = BigDecimal.new("#<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)>") 
return v.to_s('F') 

Irgendwelche Ideen?

+1

Sie haben die _String_ ' "# " in Ihrer Datenbank !? Sind Sie sicher, dass dies keine ['BigDecimal'] (http://ruby-doc.org/stdlib/libdoc/bigdecimal/rdoc/BigDecimal.html) Instanz ist? – Stefan

+0

Ich denke du brauchst nur einen zweiten Parameter. und es ist auch eine Schnur. Also müssen Sie den zweiten Parameter durch Split-Funktion extrahieren –

+0

@Stefan - ja ein bisschen seltsam - es ist ein Auszug aus einem Cache-JSON-Array, die in meiner Datenbank ist (ursprünglich von einem API-Aufruf). – vectran

Antwort

1

Erstens: Warum sind diese BigDecimal in BigDecimal#inspect Darstellung in der DB gespeichert? Das ist falsch und schlecht und sollte behoben werden.

Während das Format in der Ruby-API dokumentiert zu sein scheint, ist es wahrscheinlich nicht garantiert, dass es in allen Versionen persistent ist.

Ich würde einen regulären Ausdruck verwenden, um den relevanten Teil parst, nur um sicher zu sein, dass ich die richtigen Dinge zu lesen und eine korrekte Fehlermeldung erhalten, wenn das Format nicht überein:

match = big_decimal_as_string.match(/#<BigDecimal:[a-f0-9]+,'([0-9E\.]+)',\d+\(\d+\)>/) 
if match 
    BigDecimal.new(match[1]) 
else 
    raise "Could not parse #{big_decimal_as_string}" 
end 
+0

Danke für die elegante Lösung. Du hattest Recht und ich habe die Architektur überarbeitet und jetzt in der Datenbank als Dezimalzahlen gespeichert. [Anmerkung zu sich selbst - wenn es nicht einfach ist; Ich mache es wahrscheinlich falsch] – vectran