Мартин обнови решението на 10.10.2015 14:54 (преди около 9 години)
+def convert_to_bgn(amount, currency, formatting=true)
+ case currency
+ when :bgn
+ formatting ? format_price(amount) : amount
+ when :usd
+ formatting ? format_price(usd_to_bgn(amount)) : usd_to_bgn(amount)
+ when :eur
+ formatting ? format_price(eur_to_bgn(amount)) : eur_to_bgn(amount)
+ else
+ formatting ? format_price(gbp_to_bgn(amount)) : gbp_to_bgn(amount)
+ end
+end
+
+def usd_to_bgn(amount)
+ amount * 1.7408
+end
+
+def eur_to_bgn(amount)
+ amount * 1.9557
+end
+
+def gbp_to_bgn(amount)
+ amount * 2.6415
+end
+
+def format_price(price)
+ ('%.2f' % price).to_f
+end
+
+def compare_prices(first_amount, first_currency, second_amount, second_currency)
+ convert_to_bgn(first_amount, first_currency, false) -
+ convert_to_bgn(second_amount,second_currency, false)
+end
Здравей :)
Имам няколко препоръки:
- Виждам, че си се сетил за случая, в който закръгляването може да промени резултата от сравнението. Този случай няма да го тестваме и не ни интересува :) По-добре махни аргумента
formatting
(който всъщност трябва да се казваrounding
илиround
). - Защо са ти отделни функции
usd_to_bgn
,eur_to_bgn
иgbp_to_bgn
? Можеш просто да ги умножиш вconvert_to_bgn
. - След като махнеш
formatting
може да използваш едноредове условия приcase
:
case currency
when :usd then ...
when :eur then ...
when :gbp then ...
else ...
end
- Забележи индентацията при
case
-a. :) -
('%.2f' % price).to_f
е като да напишеш числото на лист, да го срежеш с ножица след втория символ, евентуално поправяйки последната цифра. Вместо да го закръглиш наум. Погледни документацията :) Може да погледнеш и за оператора<=>
. :)
Напомням, че все още имаш възможност да подобриш кода и да ни изпратиш ново решение :)