Ruby on Rails - Валюта: запятые, вызывающие проблему - PullRequest
2 голосов
/ 25 января 2010

Глядя на SO, я вижу, что предпочтительным способом валюты с использованием RoR является использование десятичного числа (8,2) и для вывода их с помощью number_to_currency ();

Я могу получить свои числа из БД,но у меня возникают проблемы при их получении.

Внутри моего действия по обновлению у меня есть следующая строка:

if @non_labor_expense.update_attributes(params[:non_labor_expense]) 
puts YAML::dump(params) 

Дамп параметров показывает правильное значение.xx, yyy.zz, но то, что хранится в БД, это только xx.00

Что мне нужно сделать, чтобы учесть, что могут быть запятые, а пользователь не может вводить .zz (центы).Некоторое регулярное выражение и для запятой?как бы вы справились с десятичной дробью, если бы она была .2 против .20.

Должен быть встроенный или, по крайней мере, лучший способ.

Моя миграция (не знаю, поможет ли это):

class ChangeExpenseToDec < ActiveRecord::Migration
    def self.up
       change_column :non_labor_expenses, :amount, :decimal, :precision => 8, :scale => 2
    end

    def self.down
          change_column :non_labor_expenses, :amount, :integer
    end
end

Ответы [ 4 ]

8 голосов
/ 31 января 2010

Я попробовал идею Даниэля before_validation, и я просто не мог заставить ее работать. Казалось, что к тому времени, когда я доберусь до before_validation, вход уже был преобразован. Решение, с которым я пошел, состояло в том, чтобы переопределить метод для столбца и убрать запятые там:

def profit=(num)
  num.gsub!(',','') if num.is_a?(String)
  self[:profit] = num
end
5 голосов
/ 25 января 2010

Это может зависеть от того, какую СУБД вы используете, но, насколько мне известно, десятичные поля не будут принимать запятые (по крайней мере, не как разделители; может быть, есть способ, чтобы база данных принимала запятую как десятичную точка, а не точка). То, что вам нужно будет сделать, это удалить запятые с ваших номеров (возможно, в фильтре before_save или before_validation), а затем, когда вы отобразите номер, добавить запятые обратно.

before_validation :strip_commas_from_non_labor_expense

def strip_commas_from_non_labor_expense
  self.non_labor_expense = self.non_labor_expense.to_s.gsub(/,/, '').to_f
end

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

<%
  non_labor_expense = ... # get value from your model
  puts number_to_currency(non_labor_expense, :precision => 2, :separator => ',')
%>
3 голосов
/ 29 марта 2010

Оформить драгоценный камень delocalize:

http://github.com/clemens/delocalize

1 голос
/ 21 марта 2010

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

http://gem -session.com / 2010/03 / как в использовании самой запятой в десятичной сепараторе-в-рельсах-ActiveRecord-колонки-и-текстовые поля

...