Как я преобразовываю десятичное число для строкового представления значения за доллары и центы в рубине?

Учитывая ваш вариант использования, я бы использовал условное агрегирование :

SELECT u.id, u.firstname, u.lastname
FROM users u
INNER JOIN users_meta um ON um.user_id = u.id 
WHERE u.sexe = 'M'
GROUP BY u.id, u.firstname, u.lastname
HAVING MAX(um.meta_key = 'user_att1' AND um.meta_value = 1) > 0
ORDER BY u.id DESC
LIMIT 0, 20

Приятно, что вы можете добавить больше критериев для users_meta.meta_key, просто добавив больше условия в пункте HAVING.

5
задан Tony 13 April 2009 в 20:05
поделиться

5 ответов

Это можно сделать с помощью небольшого кусочка кода Ruby. :

fmt = "%05.2f" % cost
cost_dollars, cost_cents = fmt.split '.'
18
ответ дан 18 December 2019 в 05:21
поделиться

Если вы пытаетесь отформатировать долларовые значения в представлении, вы должны взглянуть на number_to_currency в ActionView :: Helpers :: NumberHelper.

>> bd = BigDecimal.new "5.75"   
>> include ActionView::Helpers
>> number_to_currency(bd)
=> "$5.75"

Что касается разбивки стоимость в долларах и центах, мой первый вопрос будет: «Почему?» Если у вас есть веская причина, и вы имеете дело с десятичными знаками в своей базе данных, вы можете сделать следующее.

>> bd = BigDecimal.new "5.75"
>> "dollars:#{bd.truncate} cents:#{bd.modulo(1) * BigDecimal.new('100')}"
=> "dollars:5.0 cents:75.0"
8
ответ дан 18 December 2019 в 05:21
поделиться

number_to_currency неплохо, но может дорого обойтись; Вы можете захотеть бросить свой собственный, если вам нужно много раз его назвать.

Вы должны знать, что использование плавающей запятой для хранения валюты может быть проблематичным ( и см. ), если Вы делаете много расчетов на основе этих значений. Одним из решений является использование целых чисел для валюты и подсчета центов. Похоже, это подход, используемый плагином для денег . Другое решение заключается в использовании в вашей миграции типа decimal , который должен работать "из коробки" для современных версий Rails (> 1.2):

add_column :items, :price, :decimal, :precision => 10, :scale => 2

(: scale это число знаков после запятой, : precision - это общее количество цифр.) Это даст вам объекты BigDecimal в Rails, с которыми немного сложнее работать, но не плохо.

И целочисленный, и десятичный подходы немного медленнее, чем с плавающей запятой. В некоторых местах я использую плавающие числа для валюты, потому что я знаю, что мне не нужно делать вычисления для значений в Rails, только хранить и отображать их. Но если вам нужны точные расчеты валют, не используйте поплавки.

7
ответ дан 18 December 2019 в 05:21
поделиться

Вместо сохранения в виде десятичной дроби, сохраните как целое число центов , Таким образом, 1 доллар хранится как 100 в базе данных.

В качестве альтернативы, если вы не возражаете против небольшого снижения производительности, проверьте «.» в значении базы данных. Если он существует, разделите его на «.» И проанализируйте части как целые числа.

5
ответ дан 18 December 2019 в 05:21
поделиться

sprintf is your friend here:

cost_dollars = sprintf('%02.f', cost)
cost_cents = sprintf('%.2f', cost)
2
ответ дан 18 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: