2016-09-19 2 views
1

У меня есть чистое строковое значение, которое было получено из вызова API и хранится в базе данных в виде строки:Преобразование BigDecimal строки в валюте

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

Это необходимо преобразовать в значение валюты каким-то образом.

Я ожидал бы что-то вроде этого, чтобы работать, но он просто возвращается как ноль.

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

Любые идеи?

+1

Вы иметь _string_ ' "# " 'в вашей базе !? Вы уверены, что это не экземпляр ['BigDecimal'] (http://ruby-doc.org/stdlib/libdoc/bigdecimal/rdoc/BigDecimal.html)? – Stefan

+0

Думаю, вам нужен только второй параметр. а также это строка. Таким образом, вам нужно извлечь второй параметр с помощью функции split –

+0

@Stefan - да немного странно - это извлечение кэшированного массива JSON, который находится в моей базе данных (первоначально из вызова API). – vectran

ответ

1

Во-первых: почему эти BigDecimal хранятся в BigDecimal#inspect представлении в БД? Это неправильно и плохо и должно быть исправлено.

Хотя формат, по-видимому, задокументирован в ruby ​​API, вероятно, не гарантированно будет сохраняться в разных версиях.

Я хотел бы использовать регулярное выражение для разбора из соответствующей части, просто чтобы быть уверенным, что я читаю правильные вещи и получить надлежащую ошибку, если формат не соответствует:

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

Спасибо за элегантное решение. Вы были правы, и я переработал архитектуру и теперь сохраняю как аккуратные десятичные числа в БД. [Примечание для себя - если это нелегко; Возможно, я ошибаюсь] – vectran

Смежные вопросы