Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > Строку в число


Автор: Лена 25.12.2009, 12:00
Есть код:
<span class="price"><%= (product.price) %></span>
Подскажите как умножить product.price например на число 8.10 и вывести результат в span
Пробовала вставить метод eval, но что-то не получается...

Автор: source777 25.12.2009, 15:55
А product.price - это строка?  smile 

По теме:
Код

8.1 * "24.7".to_f  # => 200.07

Автор: Лена 25.12.2009, 16:55
Цитата(source777 @  25.12.2009,  15:55 Найти цитируемый пост)
А product.price - это строка


Определена так:
add_column :products, :price, :decimal, :precision => 8,
               :scale => 2, :default => 0

Но когда я по своему разумению написала так: 
<span class="price"><%= (product.price) * 8 %></span>
Я получила восемь раз вывод цены на сайте. smile 

Автор: Лена 25.12.2009, 18:48
А как быть при такой ситуации:
class StoreController < ApplicationController
  
  before_filter :poisk

***************************

def poisk
      @curs = Back.find(:first, :order => 'id desc') 
    end


Попытка написать так:
<td><span class="price"><%=  @curs * (product.price) %> гр.</span></td>

приводит к ошибке:
undefined method `*' for #<Back:0x476d4ec @attributes={"id"=>"13", "course"=>"8.10"}>

Добавлено через 10 минут и 40 секунд
А так:
<td><span class="price"><%=   (product.price)  * @curs %> гр.</span></td>
Back can't be coerced into BigDecimal

Автор: source777 25.12.2009, 19:02
Цитата(Лена @  25.12.2009,  16:55 Найти цитируемый пост)
Но когда я по своему разумению написала так: 
<span class="price"><%= (product.price) * 8 %></span>
Я получила восемь раз вывод цены на сайте. smile  

Странный баг, (product.price) интерпретируется как строка.  smile 
Попробуй <%= (8*product.price) %>

Добавлено через 2 минуты и 12 секунд
Цитата(Лена @  25.12.2009,  18:48 Найти цитируемый пост)
Попытка написать так:
<td><span class="price"><%=  @curs * (product.price) %> гр.</span></td>

приводит к ошибке:
undefined method `*' for #<Back:0x476d4ec @attributes={"id"=>"13", "course"=>"8.10"}>

Добавлено через 10 минут и 40 секунд
А так:
<td><span class="price"><%=   (product.price)  * @curs %> гр.</span></td>
Back can't be coerced into BigDecimal

Ну так у тебя @curs - это объект типа Back. Кстати, странное название...
Поэтому должно быть:
<%=  @curs.course * product.price %>

Автор: Лена 25.12.2009, 19:23
Цитата(source777 @  25.12.2009,  19:02 Найти цитируемый пост)
Попробуй <%= (8*product.price) %>


Работает!  smile 

Цитата(source777 @  25.12.2009,  19:02 Найти цитируемый пост)
<%=  @curs.course * product.price %> 


Спасибо!
Для моего варианта из-за приведения типов, пришлось написать так:
<td><span class="price"><%=  (product.price * @curs.course.to_f) %> гр.</span></td>

Дело в том, что изначально в course планировалось хранить курс и буквы типа: 8.10 гр. Теперь там храниться просто 8.10, поэтому @curs.course.to_f, чтобы не переделывать таблицу в базе  smile

Добавлено через 4 минуты и 46 секунд
А не подскажите, функцию, которая могла бы отбросить дробную часть и округлить число в этом выражении:
<td><span class="price"><%=  h(product.price * @curs.course.to_f) %> гр.</span></td>

Автор: source777 25.12.2009, 19:42
Цитата(Лена @  25.12.2009,  19:23 Найти цитируемый пост)
А не подскажите, функцию, которая могла бы отбросить дробную часть и округлить число в этом выражении:
<td><span class="price"><%=  h(product.price * @curs.course.to_f) %> гр.</span></td>

Ну так round, ясное дело. Кстати, зачем тебе вызов h в данном случае?
<%= (product.price * @curs.course.to_f).round %>

Цитата(Лена @  25.12.2009,  19:23 Найти цитируемый пост)
Дело в том, что изначально в course планировалось хранить курс и буквы типа: 8.10 гр. Теперь там храниться просто 8.10, поэтому @curs.course.to_f, чтобы не переделывать таблицу в базе  smile

Странное решение, у тебя там много валют что-ли? В чём сложность переделать таблицу? См. http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column

Автор: Лена 25.12.2009, 20:01
Цитата(source777 @  25.12.2009,  19:42 Найти цитируемый пост)
Ну так round, ясное дело. Кстати, зачем тебе вызов h в данном случае?


Cпасибо работает! 
h вставляю, так как в книге пугают - вставлейте везде где только можно метод h smile 

Цитата(source777 @  25.12.2009,  19:42 Найти цитируемый пост)
Странное решение, у тебя там много валют что-ли? В чём сложность переделать таблицу? См. change_column 


У меня там одна валюта, просто модернизацию базы я всегда пытаюсь оттянуть как можно подальше. Очень не люблю этот процесс. Хотя на будущий проект (если он будет), понимаю, что лучше переделать столбик, чем писать to_f

Сейчас все работает как надо, спасибо!  smile 

Автор: source777 25.12.2009, 20:09
Цитата(Лена @  25.12.2009,  20:01 Найти цитируемый пост)
h вставляю, так как в книге пугают - вставлейте везде где только можно метод h smile 

Ну ты хоть запомнила его назначение? 
h - это сокращение от html_escape, что ты в числе экранировать собралась?  smile 

Автор: Лена 25.12.2009, 20:28
Цитата(source777 @  25.12.2009,  20:09 Найти цитируемый пост)
h - это сокращение от html_escape, что ты в числе экранировать собралась? 


Понятно. Это я автоматом расставляла. smile 

Автор: Лена 25.12.2009, 22:09
Цитата(source777 @  25.12.2009,  19:42 Найти цитируемый пост)
<%= (product.price * @curs.course.to_f).round %>


А есть ли функция, которая не округляла, а просто убирала дробную часть или хотябы всегда округляла в меньшую сторону?
123.2=123
123.8=123


Автор: source777 25.12.2009, 22:21
Цитата(Лена @  25.12.2009,  22:09 Найти цитируемый пост)
А есть ли функция, которая не округляла, а просто убирала дробную часть или хотябы всегда округляла в меньшую сторону?

floor округляет в меньшую сторону
ceil - в большую
to_i убирает дробную часть

Автор: Лена 25.12.2009, 22:26
Цитата(source777 @  25.12.2009,  22:21 Найти цитируемый пост)
floor - в меньшую
ceil - в большую


Большое спасибо, попробую. Купила себе книжку: http://www.books.ru/shop/books/520674 но толком нужную информацию в ней не нахожу. smile 
Спасибо форуму!  smile 

Автор: source777 25.12.2009, 23:41
Цитата(Лена @  25.12.2009,  22:26 Найти цитируемый пост)
Купила себе книжку: http://www.books.ru/shop/books/520674 но толком нужную информацию в ней не нахожу. 

Ну тут у тебя 2 варианта:
1) прочитать всю книгу по порядку, а затем с легкостью вспоминать какая инфа там есть, а какой нет.
2) пользоваться предметным указателем: Числа > с плавающей точкой > округление > стр. 160  smile 

Автор: Лена 26.12.2009, 00:59
Цитата(source777 @  25.12.2009,  23:41 Найти цитируемый пост)
2) пользоваться предметным указателем: Числа > с плавающей точкой > округление > стр. 160    


Ну а где там описание методов floor - в меньшую и ceil - в большую smile 

Автор: source777 26.12.2009, 13:56
Цитата(Лена @  26.12.2009,  00:59 Найти цитируемый пост)
Ну а где там описание методов floor - в меньшую и ceil - в большую smile

Описания там нет, но в примере floor всё-таки используется. Просто книга имеет вводящий в заблуждение перевод названия "Программирование на языке Ruby", т.е. можно подумать что это учебник, но в оригинале она называется "The Ruby Way". 
Поэтому в ней прежде всего показано, чем Ruby отличается от других языков программирования. А уж названия функций для округления везде одинаковы, что в С++, что в Delphi, что в C#, что в Python, что в Ruby. Поэтому на это акцент не делается. 

Автор: Лена 26.12.2009, 15:13
Кстати и в этой книге нет этой информации: http://www.books.ru/shop/books/565628
но есть форум, а это, как выяснилось, лучше книг.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)