Как преобразовать целое число в BigDecimal в модели Rails 4

#ruby-on-rails #integer

#ruby-на-рельсах #целое число

Вопрос:

Хорошо, я генерирую некоторый CSV-файл из модели заказа. Итак, в моей модели мне нужно преобразовать значение, сохраненное как целое число (я преобразовал значение заказа в центы и сохранил как целое число), в денежный формат: например, если у меня есть 1198 в базе данных, я хотел бы отобразить его 11.98 следующим образом. Как я могу этого добиться?

Я уже пробовал:

 value = BigDecimal.new(value / 100).to_s
value = (value / 100).to_s
value = value.to_f / 100
 

Но ничего из вышеперечисленного не сработало. Есть какие-нибудь идеи?

Комментарии:

1. Что value.to_f / 100 это вам дает?

2. @MikeH Если исходное значение было 1198, это дает мне 11

3. @WagnerMatosUK If the original value was 1198, it gives me 11 — это невозможно. 1198.to_f / 100 должен дать вам 11.98 — это единственный вариант 🙂 (потому что, если любой из операндов является Float, вы всегда получите Float)

Ответ №1:

Чтобы получить поплавок:

 (1198 / 100.to_f).round(2)
#=> 11.98
 

Чтобы получить BigDecimal:

 value = 1198    
bd = BigDecimal((1198 / 100.to_f).to_s)
#=> 0.1198e2
bd.to_f
#=> 11.98
 

Комментарии:

1. Вы должны преобразовать операторы в BigDecimal, прежде чем выполнять операцию, иначе это бесполезно: (

2. @pj.martorell ерунда. Зависит от необходимости. Если нужны точные вычисления, она в первую очередь будет хранить данные в десятичных числах. Здесь автор просто спросил, как преобразовать что-то в BigDecimal, и он получил ответ.

3. @pj.martorell более того, в данном конкретном случае преобразование 1198 nor 100 в bigdecimal предыдущих вычислений не имеет никакого смысла — это не изменит результирующее число.

4. Я получаю BigDecimal.new( 100 ) #=> NoMethodError (undefined method новое ‘для BigDecimal: Class)`. Изменился ли этот API? Я на Ruby 2.7.2.

5. Да, это было устаревшим. Используйте BigDecimal(100) сейчас.