diff --git a/lib/liquid/utils.rb b/lib/liquid/utils.rb index 4e18138..f8f5d71 100644 --- a/lib/liquid/utils.rb +++ b/lib/liquid/utils.rb @@ -52,7 +52,11 @@ module Liquid when String (obj.strip =~ /\A\d+\.\d+\z/) ? BigDecimal.new(obj) : obj.to_i else - 0 + if obj.respond_to?(:to_number) + obj.to_number + else + 0 + end end end diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index eb88384..38a43b3 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -41,6 +41,16 @@ class TestEnumerable < Liquid::Drop end end +class NumberLikeThing < Liquid::Drop + def initialize(amount) + @amount = amount + end + + def to_number + @amount + end +end + class StandardFiltersTest < Minitest::Test include Liquid @@ -391,6 +401,8 @@ class StandardFiltersTest < Minitest::Test assert_raises(Liquid::ZeroDivisionError) do assert_template_result "4", "{{ 1 | modulo: 0 }}" end + + assert_template_result "5", "{{ price | divided_by:2 }}", 'price' => NumberLikeThing.new(10) end def test_modulo