diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 5757760245b9..6a1d2eb16acc 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -53,8 +53,12 @@ function currencyFilter($locale) { var formats = $locale.NUMBER_FORMATS; return function(amount, currencySymbol){ if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM; - return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2). - replace(/\u00A4/g, currencySymbol); + + // if null or undefined pass it through + return (amount == null) + ? amount + : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2). + replace(/\u00A4/g, currencySymbol); }; } @@ -113,14 +117,18 @@ numberFilter.$inject = ['$locale']; function numberFilter($locale) { var formats = $locale.NUMBER_FORMATS; return function(number, fractionSize) { - return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, - fractionSize); + + // if null or undefined pass it through + return (number == null) + ? number + : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); }; } var DECIMAL_SEP = '.'; function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { - if (number == null || !isFinite(number) || isObject(number)) return ''; + if (!isFinite(number) || isObject(number)) return ''; var isNegative = number < 0; number = Math.abs(number); diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js index 7d2acef42601..6f48bc826749 100644 --- a/test/ng/filter/filtersSpec.js +++ b/test/ng/filter/filtersSpec.js @@ -98,10 +98,14 @@ describe('filters', function() { expect(currency(1234.5678, "USD$")).toEqual('USD$1,234.57'); }); + it('should pass through null and undefined to be compatible with one-time binding', function() { + expect(currency(undefined)).toBe(undefined); + expect(currency(null)).toBe(null); + }); it('should return empty string for non-numbers', function() { - expect(currency()).toBe(''); expect(currency('abc')).toBe(''); + expect(currency({})).toBe(''); }); it('should handle zero and nearly-zero values properly', function() { @@ -130,7 +134,6 @@ describe('filters', function() { expect(number(1234)).toEqual('1,234'); expect(number(1234.5678)).toEqual('1,234.568'); expect(number(Number.NaN)).toEqual(''); - expect(number(null)).toEqual(''); expect(number({})).toEqual(''); expect(number([])).toEqual(''); expect(number(+Infinity)).toEqual(''); @@ -161,6 +164,11 @@ describe('filters', function() { expect(number(0, 8)).toEqual("0.00000000"); }); + it('should pass through null and undefined to be compatible with one-time binding', function() { + expect(number(null)).toBe(null); + expect(number(undefined)).toBe(undefined); + }); + it('should filter exponentially large numbers', function() { expect(number(1e50)).toEqual('1e+50'); expect(number(-2e100)).toEqual('-2e+100');