From 53f922ed61222c792c69d4003ca651e98a1514c8 Mon Sep 17 00:00:00 2001 From: An Phan Date: Fri, 15 Apr 2016 22:42:58 +0800 Subject: [PATCH] Add support for decimal places in currency filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the "currency" filter only accepts one argument: the currency symbol. The number of decimal places is fixed as 2. This can cause troubles with several currencies out there whose number of decimal places can be 0 (e.g. Japanese Yen or Vietnamese Dong) or 3 (e.g. Jordanian Dinar). This commit modifies the filter to accept an extra optional argument: decimal places, which defaults to 2. With this, one can write `{{ 1234 | currency '¥' 0 }}` to properly display a Yen value. Backward compatibility is maintained. --- src/filters/index.js | 14 ++++++++++---- test/unit/specs/filters/filters_spec.js | 6 ++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/filters/index.js b/src/filters/index.js index bd048fa29f8..621fc99b453 100644 --- a/src/filters/index.js +++ b/src/filters/index.js @@ -64,19 +64,25 @@ export default { * 12345 => $12,345.00 * * @param {String} sign + * @param {Number} decimals Decimal places */ - currency (value, currency) { + currency (value, currency, decimals) { value = parseFloat(value) if (!isFinite(value) || (!value && value !== 0)) return '' currency = currency != null ? currency : '$' - var stringified = Math.abs(value).toFixed(2) - var _int = stringified.slice(0, -3) + decimals = decimals != null ? decimals : 2 + var stringified = Math.abs(value).toFixed(decimals) + var _int = decimals + ? stringified.slice(0, -1 - decimals) + : stringified var i = _int.length % 3 var head = i > 0 ? (_int.slice(0, i) + (_int.length > 3 ? ',' : '')) : '' - var _float = stringified.slice(-3) + var _float = decimals + ? stringified.slice(-1 - decimals) + : '' var sign = value < 0 ? '-' : '' return sign + currency + head + _int.slice(i).replace(digitsRE, '$1,') + diff --git a/test/unit/specs/filters/filters_spec.js b/test/unit/specs/filters/filters_spec.js index 47800f55167..acb7752d73e 100644 --- a/test/unit/specs/filters/filters_spec.js +++ b/test/unit/specs/filters/filters_spec.js @@ -67,6 +67,12 @@ describe('Filters', function () { expect(filter(2134, '@')).toBe('@2,134.00') // no symbol expect(filter(2134, '')).toBe('2,134.00') + // decimal places + expect(filter(1234, '$', 0)).toBe('$1,234') + // if decimal places are present, currency is required + expect(filter(1234, '', 2)).toBe('1,234.00') + expect(filter(123.4, '$', 3)).toBe('$123.400') + expect(filter(-12345, 'VND', 0)).toBe('-VND12,345') // falsy, infinity and 0 expect(filter(0)).toBe('$0.00') expect(filter(false)).toBe('')