Compare commits

...

4 Commits

Author SHA1 Message Date
Mike Angell
e2f5cf30f6 Format tests 2019-09-16 12:37:37 +10:00
Mike Angell
917ae7a6ab Switch to named inputs 2019-09-16 12:36:37 +10:00
Mike Angell
bfe4f60e13 Follow ISO recommendation to use space as thousands separator 2019-09-01 09:01:02 +10:00
Mike Angell
32b9530985 Add new format filter 2019-09-01 00:07:42 +10:00
2 changed files with 30 additions and 0 deletions

View File

@@ -391,6 +391,17 @@ module Liquid
raise Liquid::FloatDomainError, e.message
end
# Defaults are passed as nil so systems can easily override
def format_number(input, options = {})
options = {} unless options.is_a?(Hash)
precision = options['precision'] || 2
delimiter = options['delimiter'] || " ".freeze
separator = options['separator'] || ".".freeze
return input if (prec = Utils.to_number(precision).to_i) < 0
whole_part, decimal_part = Kernel.format("%.#{prec}f", Utils.to_number(input)).split('.')
[whole_part.gsub(/(\d)(?=\d{3}+$)/, "\\1#{delimiter}"), decimal_part].compact.join(separator.to_s)
end
def ceil(input)
Utils.to_number(input).ceil.to_i
rescue ::FloatDomainError => e

View File

@@ -610,6 +610,25 @@ class StandardFiltersTest < Minitest::Test
assert_template_result "4", "{{ price | round }}", 'price' => NumberLikeThing.new(4.3)
end
def test_format_number
assert_template_result "4.60", "{{ input | format_number }}", 'input' => 4.6
assert_template_result "4.30", "{{ '4.3' | format_number }}"
assert_template_result "4.56", "{{ input | format_number: precision: 2 }}", 'input' => 4.5612
assert_template_result "5", "{{ price | format_number: precision: 0 }}", 'price' => NumberLikeThing.new(4.6)
assert_template_result "4", "{{ price | format_number: precision: 0 }}", 'price' => NumberLikeThing.new(4.3)
assert_template_result "4.30", "{{ price | format_number: precision: 2 }}", 'price' => NumberLikeThing.new(4.3)
assert_template_result "5.0000000", "{{ price | format_number: precision: 7 }}", 'price' => 5
assert_template_result "50", "{{ price | format_number: precision: -1 }}", 'price' => 50
assert_template_result "50.00", "{{ price | format_number: precision: A }}", 'price' => 50
assert_template_result "50.00", "{{ price | format_number: precision: '2e' }}", 'price' => 50
assert_template_result "50 000 000", "{{ price | format_number: precision: 0 }}", 'price' => 50000000
assert_template_result "50 000 000.00", "{{ price | format_number }}", 'price' => 50000000
assert_template_result "50000000.00", "{{ price | format_number: precision: 2, delimiter: '', separator: '.'}}", 'price' => 50000000
assert_template_result "50$000$000#00", "{{ price | format_number: precision: 2, delimiter: '$', separator:'#'}}", 'price' => 50000000
assert_template_result "-50$000$000#00", "{{ price | format_number: precision: 2, delimiter: '$', separator: '#'}}", 'price' => -50000000
assert_template_result "-50 000 000.00", "{{ price | format_number: precision: A, delimiter: A, separator: A}}", 'price' => -50000000
end
def test_ceil
assert_template_result "5", "{{ input | ceil }}", 'input' => 4.6
assert_template_result "5", "{{ '4.3' | ceil }}"