From 9ef2f77048fa964b553d691f4bbe0e5227c318c1 Mon Sep 17 00:00:00 2001 From: Jan Hesse Date: Fri, 13 Sep 2013 13:14:08 +0200 Subject: [PATCH 1/4] fixes formatting and parsing of numbers --- src/Core/Scripts/Runtime/Format.js | 17 ++++++++++++----- src/Core/Scripts/Runtime/Misc.js | 6 ++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Core/Scripts/Runtime/Format.js b/src/Core/Scripts/Runtime/Format.js index fddce5620..f67606ed9 100644 --- a/src/Core/Scripts/Runtime/Format.js +++ b/src/Core/Scripts/Runtime/Format.js @@ -8,7 +8,7 @@ function _commaFormatNumber(number, groups, decimal, comma) { number = number.substr(0, decimalIndex); } - var negative = number.startsWith('-'); + var negative = ss.startsWith(number, '-'); if (negative) { number = number.substr(1); } @@ -16,6 +16,9 @@ function _commaFormatNumber(number, groups, decimal, comma) { var groupIndex = 0; var groupSize = groups[groupIndex]; if (number.length < groupSize) { + if (negative) { + number = '-' + number; + } return decimalPart ? number + decimalPart : number; } @@ -92,6 +95,10 @@ _formatters['Number'] = function(number, format, culture) { else { s = number.toExponential(precision); } + if (nf.ds != '.') { + var index = s.indexOf('.'); + s = s.substr(0, index) + nf.ds + s.substr(index + 1); + } if (fs == 'E') { s = s.toUpperCase(); } @@ -121,10 +128,10 @@ _formatters['Number'] = function(number, format, culture) { } s = _commaFormatNumber(s, nf.curGW, nf.curDS, nf.curGS); if (number < 0) { - s = String.format(culture, nf.curNP, s); + s = ss.format(culture, nf.curNP, s); } else { - s = String.format(culture, nf.curPP, s); + s = ss.format(culture, nf.curPP, s); } break; case 'p': case 'P': @@ -138,10 +145,10 @@ _formatters['Number'] = function(number, format, culture) { } s = _commaFormatNumber(s, nf.perGW, nf.perDS, nf.perGS); if (number < 0) { - s = String.format(culture, nf.perNP, s); + s = ss.format(culture, nf.perNP, s); } else { - s = String.format(culture, nf.perPP, s); + s = ss.format(culture, nf.perPP, s); } break; } diff --git a/src/Core/Scripts/Runtime/Misc.js b/src/Core/Scripts/Runtime/Misc.js index 9275e4d8b..da6855f5a 100644 --- a/src/Core/Scripts/Runtime/Misc.js +++ b/src/Core/Scripts/Runtime/Misc.js @@ -47,6 +47,12 @@ function parseNumber(s) { if (!s || !s.length) { return 0; } + + if (ss.culture.current.nf.gs.length) + s = s.replace(new RegExp('\\' + ss.culture.current.nf.gs, 'g'), ''); + if (ss.culture.current.nf.ds.length) + s = s.replace(new RegExp('\\' + ss.culture.current.nf.ds), '.'); + if ((s.indexOf('.') >= 0) || (s.indexOf('e') >= 0) || endsWith(s, 'f') || endsWith(s, 'F')) { return parseFloat(s); From b43c52c3c64e318f38dba90693b4a2694b45cbfc Mon Sep 17 00:00:00 2001 From: Jan Hesse Date: Fri, 9 May 2014 11:28:58 +0200 Subject: [PATCH 2/4] fixes unreliable rounding in various browsers short version of: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round eg: rounding of 1.0005 with precision of 3 is different in IE than in Chrome string res = string.Format(CultureInfo.CurrentCulture, "{0:3}", 1.0005); --- src/Core/Scripts/Runtime/Format.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Scripts/Runtime/Format.js b/src/Core/Scripts/Runtime/Format.js index f67606ed9..080507fd3 100644 --- a/src/Core/Scripts/Runtime/Format.js +++ b/src/Core/Scripts/Runtime/Format.js @@ -108,7 +108,7 @@ _formatters['Number'] = function(number, format, culture) { if (precision == -1) { precision = nf.dd; } - s = number.toFixed(precision).toString(); + s = (+(Math.round(+(number + 'e' + precision)) + 'e' + -precision)).toFixed(precision) if (precision && (nf.ds != '.')) { var index = s.indexOf('.'); s = s.substr(0, index) + nf.ds + s.substr(index + 1); From 8ab27174d783b02dda9d97c47cb8a98c3ff16ddd Mon Sep 17 00:00:00 2001 From: Jan Hesse Date: Fri, 9 May 2014 11:30:26 +0200 Subject: [PATCH 3/4] semicolon missing --- src/Core/Scripts/Runtime/Format.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Scripts/Runtime/Format.js b/src/Core/Scripts/Runtime/Format.js index 080507fd3..8c6e4b95f 100644 --- a/src/Core/Scripts/Runtime/Format.js +++ b/src/Core/Scripts/Runtime/Format.js @@ -108,7 +108,7 @@ _formatters['Number'] = function(number, format, culture) { if (precision == -1) { precision = nf.dd; } - s = (+(Math.round(+(number + 'e' + precision)) + 'e' + -precision)).toFixed(precision) + s = (+(Math.round(+(number + 'e' + precision)) + 'e' + -precision)).toFixed(precision); if (precision && (nf.ds != '.')) { var index = s.indexOf('.'); s = s.substr(0, index) + nf.ds + s.substr(index + 1); From ecfdd2b0d36a74c2f37e8b6c619d09543f13b8ca Mon Sep 17 00:00:00 2001 From: Jan Hesse Date: Fri, 27 Jun 2014 11:32:46 +0200 Subject: [PATCH 4/4] format -0 as 0 --- src/Core/Scripts/Runtime/Format.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Scripts/Runtime/Format.js b/src/Core/Scripts/Runtime/Format.js index 8c6e4b95f..e177a0ece 100644 --- a/src/Core/Scripts/Runtime/Format.js +++ b/src/Core/Scripts/Runtime/Format.js @@ -75,7 +75,7 @@ _formatters['Number'] = function(number, format, culture) { if (precision != -1) { s = padLeft(s, precision, '0'); } - if (number < 0) { + if (number < 0 && s != 0) { s = '-' + s; } break;