Как вернуть плавающий рубин с двумя десятичными знаками при отображении валюты - PullRequest
0 голосов
/ 04 июня 2019

У меня есть база данных SQL, в которой хранятся цены, переданные из чисел с плавающей точкой в ​​классе Ruby, которые мне затем необходимо отобразить в файле HTML / erb. Моя проблема в том, что цена, которая равна 10,00 или 10,20, возвращается как 10,0 или 10,2, тогда она неправильно отображается в HTML. Мне нужно, чтобы цены оставались в Ruby как плавающие, поскольку они используются для расчетов ... Есть ли очевидный способ вернуть эти цены с точностью до двух знаков после запятой?

Я пытался сохранить их по-другому в моей базе данных SQL, и я думаю, что я мог бы попытаться преобразовать число с плавающей точкой в ​​строку и разбить его на десятичную точку, затем зациклить второй элемент в этом массиве и добавить еще один ноль, если одна цифра, затем собрать массив обратно в строку - но я изо всех сил пытаюсь заставить это работать ...

Мой класс Ruby настроен так:

class Transaction

  attr_accessor :amount, :merchant_id, :tag_id, :transaction_date
  attr_reader :id

  def initialize(options)

    @id = options['id'].to_i if options['id']
    @amount = options['amount'].to_f
    @merchant_id = options['merchant_id'].to_i if options['merchant_id']
    @tag_id = options['tag_id'].to_i if options['tag_id']
    @transaction_date = options['transaction_date'] if options['transaction_date']

  end

Таблица SQL также:

CREATE TABLE transactions(
  id SERIAL8 PRIMARY KEY,
  amount DECIMAL(10,2),
  transaction_date DATE,
  merchant_id INT8 REFERENCES merchants(id) ON DELETE CASCADE,
  tag_id INT8 REFERENCES tags(id) ON DELETE CASCADE
);

Когда я запускаю свой отладчик на массиве значений, я возвращаю все, что отображается как число с плавающей запятой в соответствии с тем, как я определил его в своем классе ...

1 Ответ

0 голосов
/ 04 июня 2019

Помимо очень правильного комментария о том, что вы не храните валюту в виде чисел с плавающей точкой, вы находитесь там, где вы находитесь, поэтому для отображения числа с двумя десятичными знаками вам необходимо использовать http://ruby -doc.org / core-2.0.0 /Kernel.html#method-i-sprintf

[1] pry(main)> sprintf('%.2f', 2)
=> "2.00"
[2] pry(main)> sprintf('%.2f', 2.569)
=> "2.57"
[3] pry(main)> sprintf('%.2f', 2.56)
=> "2.56"
[4] pry(main)> sprintf('%.2f', 2.56666666)
=> "2.57"

Так в вашем коде:

class Transaction

  attr_accessor :amount, :merchant_id, :tag_id, :transaction_date
  attr_reader :id

  def initialize(options)
    @id = options['id'].to_i if options['id']
    @amount = sprintf('%.2f', options['amount'].to_f)
    @merchant_id = options['merchant_id'].to_i if options['merchant_id']
    @tag_id = options['tag_id'].to_i if options['tag_id']
    @transaction_date = options['transaction_date'] if options['transaction_date']
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...