#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
nor100
в bigdecimal предыдущих вычислений не имеет никакого смысла — это не изменит результирующее число.4. Я получаю
BigDecimal.new( 100 ) #=> NoMethodError (undefined method
новое ‘для BigDecimal: Class)`. Изменился ли этот API? Я на Ruby 2.7.2.5. Да, это было устаревшим. Используйте
BigDecimal(100)
сейчас.