Skip to content

Commit 67c821d

Browse files
authored
Merge pull request #1 from gelim-ags/sum-fix
Use Big Number for add and subtract
2 parents 1e7eef1 + 834cd26 commit 67c821d

File tree

7 files changed

+150
-116
lines changed

7 files changed

+150
-116
lines changed

dist/formula-parser.js

+122-102
Original file line numberDiff line numberDiff line change
@@ -493,11 +493,11 @@ return /******/ (function(modules) { // webpackBootstrap
493493

494494
var _add2 = _interopRequireDefault(_add);
495495

496-
var _ampersand = __webpack_require__(8);
496+
var _ampersand = __webpack_require__(9);
497497

498498
var _ampersand2 = _interopRequireDefault(_ampersand);
499499

500-
var _divide = __webpack_require__(9);
500+
var _divide = __webpack_require__(10);
501501

502502
var _divide2 = _interopRequireDefault(_divide);
503503

@@ -543,7 +543,7 @@ return /******/ (function(modules) { // webpackBootstrap
543543

544544
var _error = __webpack_require__(7);
545545

546-
var _bignumber = __webpack_require__(10);
546+
var _bignumber = __webpack_require__(8);
547547

548548
var _bignumber2 = _interopRequireDefault(_bignumber);
549549

@@ -625,22 +625,32 @@ return /******/ (function(modules) { // webpackBootstrap
625625

626626
var _error = __webpack_require__(7);
627627

628+
var _bignumber = __webpack_require__(8);
629+
630+
var _bignumber2 = _interopRequireDefault(_bignumber);
631+
632+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
633+
628634
var SYMBOL = exports.SYMBOL = '+';
629635

630636
function func(first) {
631-
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
632-
rest[_key - 1] = arguments[_key];
633-
}
637+
try {
638+
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
639+
rest[_key - 1] = arguments[_key];
640+
}
634641

635-
var result = rest.reduce(function (acc, value) {
636-
return acc + (0, _number.toNumber)(value);
637-
}, (0, _number.toNumber)(first));
642+
var result = rest.reduce(function (acc, value) {
643+
return new _bignumber2.default(acc).plus(new _bignumber2.default(value)).toNumber();
644+
}, first);
638645

639-
if (isNaN(result)) {
646+
if (isNaN(result)) {
647+
throw Error(_error.ERROR_VALUE);
648+
}
649+
650+
return result;
651+
} catch (error) {
640652
throw Error(_error.ERROR_VALUE);
641653
}
642-
643-
return result;
644654
};
645655

646656
func.SYMBOL = SYMBOL;
@@ -751,85 +761,6 @@ return /******/ (function(modules) { // webpackBootstrap
751761

752762
/***/ },
753763
/* 8 */
754-
/***/ function(module, exports) {
755-
756-
'use strict';
757-
758-
Object.defineProperty(exports, "__esModule", {
759-
value: true
760-
});
761-
exports.default = func;
762-
var SYMBOL = exports.SYMBOL = '&';
763-
764-
function func() {
765-
for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {
766-
params[_key] = arguments[_key];
767-
}
768-
769-
return params.reduce(function (acc, value) {
770-
return acc + value.toString();
771-
}, '');
772-
};
773-
774-
func.SYMBOL = SYMBOL;
775-
776-
/***/ },
777-
/* 9 */
778-
/***/ function(module, exports, __webpack_require__) {
779-
780-
'use strict';
781-
782-
Object.defineProperty(exports, "__esModule", {
783-
value: true
784-
});
785-
exports.SYMBOL = undefined;
786-
exports.default = func;
787-
788-
var _number = __webpack_require__(6);
789-
790-
var _error = __webpack_require__(7);
791-
792-
var _bignumber = __webpack_require__(10);
793-
794-
var _bignumber2 = _interopRequireDefault(_bignumber);
795-
796-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
797-
798-
var SYMBOL = exports.SYMBOL = '/';
799-
800-
function func(first) {
801-
try {
802-
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
803-
rest[_key - 1] = arguments[_key];
804-
}
805-
806-
var result = rest.reduce(function (acc, value) {
807-
var tempValue = new _bignumber2.default(acc).div(new _bignumber2.default((0, _number.toNumber)(value))).toNumber();
808-
if (tempValue === Infinity || tempValue === -Infinity) {
809-
throw Error(_error.ERROR_DIV_ZERO);
810-
}
811-
812-
return tempValue;
813-
}, (0, _number.toNumber)(first));
814-
815-
if (isNaN(result)) {
816-
throw Error(_error.ERROR_VALUE);
817-
}
818-
819-
return result;
820-
} catch (error) {
821-
if (error.message === _error.ERROR_DIV_ZERO) {
822-
throw Error(_error.ERROR_DIV_ZERO);
823-
}
824-
825-
throw Error(_error.ERROR_VALUE);
826-
}
827-
};
828-
829-
func.SYMBOL = SYMBOL;
830-
831-
/***/ },
832-
/* 10 */
833764
/***/ function(module, exports, __webpack_require__) {
834765

835766
var __WEBPACK_AMD_DEFINE_RESULT__;/*! bignumber.js v4.0.0 https://github.com/MikeMcl/bignumber.js/LICENCE */
@@ -3568,6 +3499,85 @@ return /******/ (function(modules) { // webpackBootstrap
35683499
})(this);
35693500

35703501

3502+
/***/ },
3503+
/* 9 */
3504+
/***/ function(module, exports) {
3505+
3506+
'use strict';
3507+
3508+
Object.defineProperty(exports, "__esModule", {
3509+
value: true
3510+
});
3511+
exports.default = func;
3512+
var SYMBOL = exports.SYMBOL = '&';
3513+
3514+
function func() {
3515+
for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {
3516+
params[_key] = arguments[_key];
3517+
}
3518+
3519+
return params.reduce(function (acc, value) {
3520+
return acc + value.toString();
3521+
}, '');
3522+
};
3523+
3524+
func.SYMBOL = SYMBOL;
3525+
3526+
/***/ },
3527+
/* 10 */
3528+
/***/ function(module, exports, __webpack_require__) {
3529+
3530+
'use strict';
3531+
3532+
Object.defineProperty(exports, "__esModule", {
3533+
value: true
3534+
});
3535+
exports.SYMBOL = undefined;
3536+
exports.default = func;
3537+
3538+
var _number = __webpack_require__(6);
3539+
3540+
var _error = __webpack_require__(7);
3541+
3542+
var _bignumber = __webpack_require__(8);
3543+
3544+
var _bignumber2 = _interopRequireDefault(_bignumber);
3545+
3546+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3547+
3548+
var SYMBOL = exports.SYMBOL = '/';
3549+
3550+
function func(first) {
3551+
try {
3552+
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
3553+
rest[_key - 1] = arguments[_key];
3554+
}
3555+
3556+
var result = rest.reduce(function (acc, value) {
3557+
var tempValue = new _bignumber2.default(acc).div(new _bignumber2.default((0, _number.toNumber)(value))).toNumber();
3558+
if (tempValue === Infinity || tempValue === -Infinity) {
3559+
throw Error(_error.ERROR_DIV_ZERO);
3560+
}
3561+
3562+
return tempValue;
3563+
}, (0, _number.toNumber)(first));
3564+
3565+
if (isNaN(result)) {
3566+
throw Error(_error.ERROR_VALUE);
3567+
}
3568+
3569+
return result;
3570+
} catch (error) {
3571+
if (error.message === _error.ERROR_DIV_ZERO) {
3572+
throw Error(_error.ERROR_DIV_ZERO);
3573+
}
3574+
3575+
throw Error(_error.ERROR_VALUE);
3576+
}
3577+
};
3578+
3579+
func.SYMBOL = SYMBOL;
3580+
35713581
/***/ },
35723582
/* 11 */
35733583
/***/ function(module, exports) {
@@ -17206,22 +17216,32 @@ return /******/ (function(modules) { // webpackBootstrap
1720617216

1720717217
var _error = __webpack_require__(7);
1720817218

17219+
var _bignumber = __webpack_require__(8);
17220+
17221+
var _bignumber2 = _interopRequireDefault(_bignumber);
17222+
17223+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17224+
1720917225
var SYMBOL = exports.SYMBOL = '-';
1721017226

1721117227
function func(first) {
17212-
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
17213-
rest[_key - 1] = arguments[_key];
17214-
}
17228+
try {
17229+
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
17230+
rest[_key - 1] = arguments[_key];
17231+
}
1721517232

17216-
var result = rest.reduce(function (acc, value) {
17217-
return acc - (0, _number.toNumber)(value);
17218-
}, (0, _number.toNumber)(first));
17233+
var result = rest.reduce(function (acc, value) {
17234+
return new _bignumber2.default(acc).minus(new _bignumber2.default(value)).toNumber();
17235+
}, first);
1721917236

17220-
if (isNaN(result)) {
17237+
if (isNaN(result)) {
17238+
throw Error(_error.ERROR_VALUE);
17239+
}
17240+
17241+
return result;
17242+
} catch (error) {
1722117243
throw Error(_error.ERROR_VALUE);
1722217244
}
17223-
17224-
return result;
1722517245
};
1722617246

1722717247
func.SYMBOL = SYMBOL;
@@ -17242,7 +17262,7 @@ return /******/ (function(modules) { // webpackBootstrap
1724217262

1724317263
var _error = __webpack_require__(7);
1724417264

17245-
var _bignumber = __webpack_require__(10);
17265+
var _bignumber = __webpack_require__(8);
1724617266

1724717267
var _bignumber2 = _interopRequireDefault(_bignumber);
1724817268

@@ -17306,7 +17326,7 @@ return /******/ (function(modules) { // webpackBootstrap
1730617326

1730717327
var _error = __webpack_require__(7);
1730817328

17309-
var _bignumber = __webpack_require__(10);
17329+
var _bignumber = __webpack_require__(8);
1731017330

1731117331
var _bignumber2 = _interopRequireDefault(_bignumber);
1731217332

dist/formula-parser.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "hot-formula-parser",
3-
"version": "1.5.6",
3+
"version": "1.5.7",
44
"description": "Formula parser",
55
"main": "dist/formula-parser.js",
66
"scripts": {
+11-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
import {toNumber} from './../../helper/number';
22
import {ERROR_VALUE} from './../../error';
3+
import BigNumber from 'bignumber.js';
34

45
export const SYMBOL = '+';
56

67
export default function func(first, ...rest) {
7-
const result = rest.reduce((acc, value) => acc + toNumber(value), toNumber(first));
8+
try {
9+
const result = rest.reduce((acc, value) => {
10+
return (new BigNumber(acc)).plus(new BigNumber(value)).toNumber();
11+
}, first);
812

9-
if (isNaN(result)) {
13+
if (isNaN(result)) {
14+
throw Error(ERROR_VALUE);
15+
}
16+
17+
return result;
18+
} catch (error) {
1019
throw Error(ERROR_VALUE);
1120
}
12-
13-
return result;
1421
};
1522

1623
func.SYMBOL = SYMBOL;
+11-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
import {toNumber} from './../../helper/number';
22
import {ERROR_VALUE} from './../../error';
3+
import BigNumber from 'bignumber.js';
34

45
export const SYMBOL = '-';
56

67
export default function func(first, ...rest) {
7-
const result = rest.reduce((acc, value) => acc - toNumber(value), toNumber(first));
8+
try {
9+
const result = rest.reduce((acc, value) => {
10+
return (new BigNumber(acc)).minus(new BigNumber(value)).toNumber();
11+
}, first);
812

9-
if (isNaN(result)) {
13+
if (isNaN(result)) {
14+
throw Error(ERROR_VALUE);
15+
}
16+
17+
return result;
18+
} catch (error) {
1019
throw Error(ERROR_VALUE);
1120
}
12-
13-
return result;
1421
};
1522

1623
func.SYMBOL = SYMBOL;

test/unit/evaluate-by-operator/operator/add.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ describe('add operator', () => {
99
expect(func(2, 8.8)).to.eq(10.8);
1010
expect(func('2', 8.8)).to.eq(10.8);
1111
expect(func('2', '8.8')).to.eq(10.8);
12-
expect(func('2', '-8.8', 6, 0.4)).to.eq(-0.4000000000000007);
12+
expect(func('2', '-8.8', 6, 0.4)).to.eq(-0.4);
1313
expect(() => func('foo', ' ', 'bar', ' baz')).to.throw('VALUE');
1414
expect(() => func('foo', 2)).to.throw('VALUE');
1515
});

test/unit/evaluate-by-operator/operator/minus.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ describe('minus operator', () => {
66
});
77

88
it('should correctly process values', () => {
9-
expect(func(2, 8.8)).to.eq(-6.800000000000001);
10-
expect(func('2', 8.8)).to.eq(-6.800000000000001);
11-
expect(func('2', '8.8')).to.eq(-6.800000000000001);
9+
expect(func(2, 8.8)).to.eq(-6.8);
10+
expect(func('2', 8.8)).to.eq(-6.8);
11+
expect(func('2', '8.8')).to.eq(-6.8);
1212
expect(func('2', '-8.8', 6, 0.4)).to.eq(4.4);
1313
expect(() => func('foo', ' ', 'bar', ' baz')).to.throw('VALUE');
1414
expect(() => func('foo', 2)).to.throw('VALUE');

0 commit comments

Comments
 (0)