Руби читает .50 как .5 - PullRequest
       2

Руби читает .50 как .5

0 голосов
/ 12 декабря 2018

У меня есть класс Item, и я инициализировал пять переменных.Я пытаюсь сопоставить вывод в моем терминале со значением expected_summary.Я звоню Item.summary в следующем коде:

class Item
  attr_reader :name, :description, :manufacturer, :price, :summary

  def initialize (name, manufacturer, price, description=nil, summary=nil)
    @name = name
    @manufacturer = manufacturer
    @price = price
    @description = description
    if description
      @summary = "Name: #{name}
Description: #{description}
Manufacturer: #{manufacturer}
Price: $#{price}"
    else
      @summary = "Name: #{name}
Manufacturer: #{manufacturer}
Price: $#{price}"
    end
  end
end

#expected_summary = %q(Name: Spy Notebook
#Manufacturer: Spys-R-Us
#Price: $10.50)
item = Item.new("Spy Notebook", "Spys-R-Us", 10.50)
puts item.summary

Когда я передаю число 10.50 в качестве аргумента price, оно возвращается как 10.5.Я не могу понять, почему.Почему Ruby читает 10.50 как 10.5?Есть ли способ исправить это?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Ответ заключается в операторе строкового формата , который позволяет преобразовать число с плавающей точкой в ​​строку с двумя десятичными знаками.Этот метод также будет работать для округления трехзначных чисел, я больше не пробовал, но я уверен, что это сработает.Вот ваш оригинальный код, измененный, чтобы продемонстрировать, как именно он будет работать.

class Item
  attr_reader :name, :description, :manufacturer, :price, :summary 

  def initialize (name, manufacturer, price, description=nil, summary=nil) 
    @name = name
    @manufacturer = manufacturer
    @price = "%.2f" % price
    @description = description

    if description
      @summary = "Name: #{name}
                  Description: #{description}
                  Manufacturer: #{manufacturer}
                  Price: $#{@price}"
    else
      @summary = "Name: #{name}
                  Manufacturer: #{manufacturer}
                  Price: $#{@price}"
    end
  end

  def price
     @price
  end
end

РЕДАКТИРОВАТЬ: Я не видел комментарий @ tadman, пока после публикации этого, он избил меня до ответа.

0 голосов
/ 13 декабря 2018

Обычный способ форматирования чисел:

'%.02f' % number

Где это нотация printf в стиле для описания того, как вы хотите что-то отформатировать.Он унаследован от C и обнаруживается во многих других языках:

'%f' % number    # A floating-point number with default precision
'%.02f' % number # A floating-point number rounded to 2 places

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

number_with_precision(number, precision: 2, locale: :fr)
# => 1,50
0 голосов
/ 13 декабря 2018

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

def two_decimals(number)
  number = Float(number)
  price_split = number.to_s.split('.')
  price_split[1] = price_split.last + '0'*(2-price_split.last.size) if price_split.last.size < 2
  price_split.join('.')
end

two_decimals(10.25) #=> "10.25"
two_decimals(10.2) #=> "10.20"
two_decimals(10) #=> "10.00"

Или что-то лучше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...