aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/filter/filters.js13
-rw-r--r--test/ng/filter/filtersSpec.js7
2 files changed, 18 insertions, 2 deletions
diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js
index 376afd85..57186981 100644
--- a/src/ng/filter/filters.js
+++ b/src/ng/filter/filters.js
@@ -117,9 +117,18 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
formatedText = '',
parts = [];
+ var hasExponent = false;
if (numStr.indexOf('e') !== -1) {
- formatedText = numStr;
- } else {
+ var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
+ if (match && match[2] == '-' && match[3] > fractionSize + 1) {
+ numStr = '0';
+ } else {
+ formatedText = numStr;
+ hasExponent = true;
+ }
+ }
+
+ if (!hasExponent) {
var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;
// determine fractionSize if it is not specified
diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js
index 883e91f6..cbb41841 100644
--- a/test/ng/filter/filtersSpec.js
+++ b/test/ng/filter/filtersSpec.js
@@ -91,6 +91,13 @@ describe('filters', function() {
expect(currency()).toBe('');
expect(currency('abc')).toBe('');
});
+
+ it('should handle zero and nearly-zero values properly', function() {
+ // This expression is known to yield 4.440892098500626e-16 instead of 0.0.
+ expect(currency(1.07 + 1 - 2.07)).toBe('$0.00');
+ expect(currency(0.008)).toBe('$0.01');
+ expect(currency(0.003)).toBe('$0.00');
+ });
});