@syncfusion/ej2-calculate 35.1.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +263 -0
- package/README.md +132 -0
- package/base.d.ts +4 -0
- package/base.js +4 -0
- package/common.d.ts +4 -0
- package/common.js +4 -0
- package/dist/ej2-calculate.umd.min.js +11 -0
- package/dist/ej2-calculate.umd.min.js.map +1 -0
- package/dist/es6/ej2-calculate.es2015.js +24801 -0
- package/dist/es6/ej2-calculate.es2015.js.map +1 -0
- package/dist/es6/ej2-calculate.es5.js +27229 -0
- package/dist/es6/ej2-calculate.es5.js.map +1 -0
- package/dist/global/ej2-calculate.min.js +11 -0
- package/dist/global/ej2-calculate.min.js.map +1 -0
- package/dist/global/index.d.ts +14 -0
- package/formulas.d.ts +4 -0
- package/formulas.js +4 -0
- package/index.d.ts +4 -0
- package/index.js +4 -0
- package/license +10 -0
- package/package.json +30 -0
- package/src/base/calculate-model.d.ts +4 -0
- package/src/base/calculate-model.js +0 -0
- package/src/base/calculate.d.ts +1105 -0
- package/src/base/calculate.js +4720 -0
- package/src/base/index.d.ts +8 -0
- package/src/base/index.js +7 -0
- package/src/base/parser.d.ts +208 -0
- package/src/base/parser.js +1512 -0
- package/src/common/address.d.ts +59 -0
- package/src/common/address.js +96 -0
- package/src/common/cell-ref.d.ts +32 -0
- package/src/common/cell-ref.js +112 -0
- package/src/common/common.d.ts +44 -0
- package/src/common/common.js +134 -0
- package/src/common/enum.d.ts +94 -0
- package/src/common/enum.js +97 -0
- package/src/common/index.d.ts +9 -0
- package/src/common/index.js +8 -0
- package/src/common/interface.d.ts +122 -0
- package/src/common/interface.js +0 -0
- package/src/common/l10n.d.ts +24 -0
- package/src/common/l10n.js +54 -0
- package/src/common/number-date.d.ts +26 -0
- package/src/common/number-date.js +38 -0
- package/src/common/sheet-info.d.ts +10 -0
- package/src/common/sheet-info.js +17 -0
- package/src/common/sort.d.ts +17 -0
- package/src/common/sort.js +44 -0
- package/src/formulas/array.d.ts +47 -0
- package/src/formulas/array.js +718 -0
- package/src/formulas/basic.d.ts +47 -0
- package/src/formulas/basic.js +181 -0
- package/src/formulas/complex-numbers.d.ts +207 -0
- package/src/formulas/complex-numbers.js +549 -0
- package/src/formulas/database.d.ts +152 -0
- package/src/formulas/database.js +579 -0
- package/src/formulas/date-time-extra.d.ts +97 -0
- package/src/formulas/date-time-extra.js +415 -0
- package/src/formulas/date-time-intl.d.ts +57 -0
- package/src/formulas/date-time-intl.js +309 -0
- package/src/formulas/date-time.d.ts +164 -0
- package/src/formulas/date-time.js +1021 -0
- package/src/formulas/engineering-base.d.ts +150 -0
- package/src/formulas/engineering-base.js +404 -0
- package/src/formulas/engineering-bessel.d.ts +65 -0
- package/src/formulas/engineering-bessel.js +167 -0
- package/src/formulas/engineering-convert.d.ts +35 -0
- package/src/formulas/engineering-convert.js +120 -0
- package/src/formulas/engineering-misc.d.ts +64 -0
- package/src/formulas/engineering-misc.js +168 -0
- package/src/formulas/financial-amortization-ecma.d.ts +87 -0
- package/src/formulas/financial-amortization-ecma.js +288 -0
- package/src/formulas/financial-annuity.d.ts +104 -0
- package/src/formulas/financial-annuity.js +419 -0
- package/src/formulas/financial-bond-helpers.d.ts +106 -0
- package/src/formulas/financial-bond-helpers.js +190 -0
- package/src/formulas/financial-cashflow.d.ts +47 -0
- package/src/formulas/financial-cashflow.js +203 -0
- package/src/formulas/financial-coupons.d.ts +227 -0
- package/src/formulas/financial-coupons.js +810 -0
- package/src/formulas/financial-depreciation.d.ts +64 -0
- package/src/formulas/financial-depreciation.js +247 -0
- package/src/formulas/financial-rates.d.ts +54 -0
- package/src/formulas/financial-rates.js +140 -0
- package/src/formulas/financial-securities.d.ts +126 -0
- package/src/formulas/financial-securities.js +488 -0
- package/src/formulas/formula-math-helpers.d.ts +212 -0
- package/src/formulas/formula-math-helpers.js +599 -0
- package/src/formulas/formula-module-base.d.ts +54 -0
- package/src/formulas/formula-module-base.js +125 -0
- package/src/formulas/formula-owner.d.ts +17 -0
- package/src/formulas/formula-owner.js +0 -0
- package/src/formulas/index.d.ts +68 -0
- package/src/formulas/index.js +67 -0
- package/src/formulas/information-advanced.d.ts +44 -0
- package/src/formulas/information-advanced.js +157 -0
- package/src/formulas/information-ecma.d.ts +33 -0
- package/src/formulas/information-ecma.js +88 -0
- package/src/formulas/information-extra.d.ts +146 -0
- package/src/formulas/information-extra.js +351 -0
- package/src/formulas/information.d.ts +34 -0
- package/src/formulas/information.js +78 -0
- package/src/formulas/logical-extra.d.ts +75 -0
- package/src/formulas/logical-extra.js +217 -0
- package/src/formulas/logical.d.ts +83 -0
- package/src/formulas/logical.js +296 -0
- package/src/formulas/lookup-array.d.ts +98 -0
- package/src/formulas/lookup-array.js +364 -0
- package/src/formulas/lookup-ref-extra.d.ts +64 -0
- package/src/formulas/lookup-ref-extra.js +180 -0
- package/src/formulas/lookup-ref.d.ts +84 -0
- package/src/formulas/lookup-ref.js +263 -0
- package/src/formulas/lookup.d.ts +114 -0
- package/src/formulas/lookup.js +881 -0
- package/src/formulas/math-aggregate.d.ts +74 -0
- package/src/formulas/math-aggregate.js +376 -0
- package/src/formulas/math-ceiling-ecma.d.ts +42 -0
- package/src/formulas/math-ceiling-ecma.js +123 -0
- package/src/formulas/math-combinatorics.d.ts +75 -0
- package/src/formulas/math-combinatorics.js +290 -0
- package/src/formulas/math-misc.d.ts +164 -0
- package/src/formulas/math-misc.js +889 -0
- package/src/formulas/math-number.d.ts +76 -0
- package/src/formulas/math-number.js +261 -0
- package/src/formulas/math-rounding.d.ts +115 -0
- package/src/formulas/math-rounding.js +728 -0
- package/src/formulas/math-trig-hyperbolic.d.ts +55 -0
- package/src/formulas/math-trig-hyperbolic.js +113 -0
- package/src/formulas/math-trig.d.ts +165 -0
- package/src/formulas/math-trig.js +334 -0
- package/src/formulas/matrix-base.d.ts +13 -0
- package/src/formulas/matrix-base.js +169 -0
- package/src/formulas/matrix.d.ts +64 -0
- package/src/formulas/matrix.js +161 -0
- package/src/formulas/regression-ecma.d.ts +66 -0
- package/src/formulas/regression-ecma.js +234 -0
- package/src/formulas/statistical-advanced.d.ts +125 -0
- package/src/formulas/statistical-advanced.js +756 -0
- package/src/formulas/statistical-correlation.d.ts +75 -0
- package/src/formulas/statistical-correlation.js +198 -0
- package/src/formulas/statistical-dispersion.d.ts +108 -0
- package/src/formulas/statistical-dispersion.js +337 -0
- package/src/formulas/statistical-distribution-extended.d.ts +176 -0
- package/src/formulas/statistical-distribution-extended.js +668 -0
- package/src/formulas/statistical-distribution.d.ts +104 -0
- package/src/formulas/statistical-distribution.js +368 -0
- package/src/formulas/statistical-ecma.d.ts +95 -0
- package/src/formulas/statistical-ecma.js +392 -0
- package/src/formulas/statistical-extended.d.ts +136 -0
- package/src/formulas/statistical-extended.js +340 -0
- package/src/formulas/statistical-ifs.d.ts +46 -0
- package/src/formulas/statistical-ifs.js +180 -0
- package/src/formulas/statistical-moments.d.ts +84 -0
- package/src/formulas/statistical-moments.js +269 -0
- package/src/formulas/statistical-percentile.d.ts +56 -0
- package/src/formulas/statistical-percentile.js +195 -0
- package/src/formulas/statistical-sample-base.d.ts +14 -0
- package/src/formulas/statistical-sample-base.js +124 -0
- package/src/formulas/statistical.d.ts +135 -0
- package/src/formulas/statistical.js +542 -0
- package/src/formulas/text-advanced.d.ts +64 -0
- package/src/formulas/text-advanced.js +222 -0
- package/src/formulas/text-ecma.d.ts +54 -0
- package/src/formulas/text-ecma.js +106 -0
- package/src/formulas/text-extra.d.ts +216 -0
- package/src/formulas/text-extra.js +657 -0
- package/src/formulas/text.d.ts +125 -0
- package/src/formulas/text.js +628 -0
- package/src/global.js +1 -0
- package/src/index.d.ts +14 -0
- package/src/index.js +14 -0
- package/tslint.json +111 -0
|
@@ -0,0 +1,889 @@
|
|
|
1
|
+
var __extends = (this && this.__extends) || (function () {
|
|
2
|
+
var extendStatics = function (d, b) {
|
|
3
|
+
extendStatics = Object.setPrototypeOf ||
|
|
4
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
+
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
6
|
+
return extendStatics(d, b);
|
|
7
|
+
};
|
|
8
|
+
return function (d, b) {
|
|
9
|
+
extendStatics(d, b);
|
|
10
|
+
function __() { this.constructor = d; }
|
|
11
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
12
|
+
};
|
|
13
|
+
})();
|
|
14
|
+
import { FormulasErrorsStrings, CommonErrors } from '../common/index';
|
|
15
|
+
import { isNullOrUndefined } from '@syncfusion/ej2-base';
|
|
16
|
+
import { isCellReference } from '../common/cell-ref';
|
|
17
|
+
import { FormulaModuleBase } from './formula-module-base';
|
|
18
|
+
/**
|
|
19
|
+
* Core numeric utilities: absolute value, random numbers, logarithms, powers, roots, factorials, and angle/unit conversions.
|
|
20
|
+
*
|
|
21
|
+
* Registers 14 functions including ABS, RAND, RANDBETWEEN, RADIANS, DEGREES, and others.
|
|
22
|
+
*
|
|
23
|
+
* @hidden
|
|
24
|
+
*/
|
|
25
|
+
var MathMiscFormulas = /** @class */ (function (_super) {
|
|
26
|
+
__extends(MathMiscFormulas, _super);
|
|
27
|
+
/**
|
|
28
|
+
* @hidden
|
|
29
|
+
* @param {FormulaOwner} owner - Formula registration owner ({@link BasicFormulas}).
|
|
30
|
+
*/
|
|
31
|
+
function MathMiscFormulas(owner) {
|
|
32
|
+
var _this = _super.call(this, owner) || this;
|
|
33
|
+
/** Formula definitions registered with {@link BasicFormulas}. */
|
|
34
|
+
_this.formulas = [
|
|
35
|
+
{ formulaName: 'ABS', category: 'Math & Trig', description: 'Returns the absolute value of a number.' },
|
|
36
|
+
{ formulaName: 'RAND', category: 'Math & Trig', description: 'Return a random number between 0 and 1.' },
|
|
37
|
+
{ formulaName: 'RANDBETWEEN', category: 'Math & Trig', description: 'Returns an integer random number in a specified range.' },
|
|
38
|
+
{ formulaName: 'RADIANS', category: 'Math & Trig', description: 'Converts degrees to radians.' },
|
|
39
|
+
{ formulaName: 'DEGREES', category: 'Math & Trig', description: 'Converts radians to degrees.' },
|
|
40
|
+
{ formulaName: 'PI', category: 'Math & Trig', description: 'Returns the value of pi.' },
|
|
41
|
+
{ formulaName: 'MOD', category: 'Math & Trig', description: 'Returns a remainder after a number is divided by divisor.' },
|
|
42
|
+
{ formulaName: 'FACT', category: 'Math & Trig', description: 'Returns the factorial of a number.' },
|
|
43
|
+
{ formulaName: 'DECIMAL', category: 'Math & Trig', description: 'Converts a text representation of a number in a given base into a decimal number.' },
|
|
44
|
+
{ formulaName: 'LN', category: 'Math & Trig', description: 'Returns the natural logarithm of a number.' },
|
|
45
|
+
{ formulaName: 'LOG', category: 'Math & Trig', description: 'Returns the logarithm of a number to the base that you specify.' },
|
|
46
|
+
{ formulaName: 'POWER', category: 'Math & Trig', description: 'Returns the result of a number raised to power.' },
|
|
47
|
+
{ formulaName: 'SQRT', category: 'Math & Trig', description: 'Returns the square root of a positive number.' },
|
|
48
|
+
{ formulaName: 'EXP', category: 'Math & Trig', description: 'Returns e raised to the power of the given number.' }
|
|
49
|
+
];
|
|
50
|
+
return _this;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns the absolute value of a number.
|
|
54
|
+
*
|
|
55
|
+
* Excel: `ABS(...)`.
|
|
56
|
+
*
|
|
57
|
+
* @hidden
|
|
58
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
59
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* engine.computeFormula('=ABS(-5)');
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
MathMiscFormulas.prototype.ComputeABS = function () {
|
|
67
|
+
var args = [];
|
|
68
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
69
|
+
args[_i] = arguments[_i];
|
|
70
|
+
}
|
|
71
|
+
var argArr = args;
|
|
72
|
+
var cellvalue = '';
|
|
73
|
+
var absVal;
|
|
74
|
+
if (args.length === 0 || args.length > 1) {
|
|
75
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
76
|
+
}
|
|
77
|
+
if (argArr[0] === '') {
|
|
78
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
79
|
+
}
|
|
80
|
+
var argVal = argArr[0].split(this.parent.tic).join('').trim();
|
|
81
|
+
if (argVal === '' || (argArr[0].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(argVal)))) {
|
|
82
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
83
|
+
}
|
|
84
|
+
if (this.parent.isCellReference(argArr[0])) {
|
|
85
|
+
cellvalue = this.parent.getValueFromArg(argArr[0]);
|
|
86
|
+
if (this.parent.getErrorStrings().indexOf(cellvalue) > -1) {
|
|
87
|
+
return cellvalue;
|
|
88
|
+
}
|
|
89
|
+
if (cellvalue === this.parent.trueValue) {
|
|
90
|
+
cellvalue = '1';
|
|
91
|
+
}
|
|
92
|
+
if (cellvalue === '' || cellvalue === this.parent.falseValue) {
|
|
93
|
+
cellvalue = '0';
|
|
94
|
+
}
|
|
95
|
+
absVal = this.parent.parseFloat(cellvalue);
|
|
96
|
+
if (isNaN(absVal) && !this.parent.isNumber(cellvalue)) {
|
|
97
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
cellvalue = this.parent.getValueFromArg(argArr[0]).split(this.parent.tic).join();
|
|
102
|
+
if (cellvalue === this.parent.trueValue) {
|
|
103
|
+
cellvalue = '1';
|
|
104
|
+
}
|
|
105
|
+
if (cellvalue === this.parent.falseValue) {
|
|
106
|
+
cellvalue = '0';
|
|
107
|
+
}
|
|
108
|
+
if (this.parent.getErrorStrings().indexOf(cellvalue) > -1) {
|
|
109
|
+
return cellvalue;
|
|
110
|
+
}
|
|
111
|
+
absVal = this.parent.parseFloat(cellvalue);
|
|
112
|
+
if (isNaN(absVal) && !this.parent.isNumber(cellvalue)) {
|
|
113
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return Math.abs(absVal);
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Return a random number between 0 and 1.
|
|
120
|
+
*
|
|
121
|
+
* Excel: `RAND(...)`.
|
|
122
|
+
*
|
|
123
|
+
* @hidden
|
|
124
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
125
|
+
* @returns {string | number} - Computed text result or an Excel error token such as `#VALUE!`.
|
|
126
|
+
*/
|
|
127
|
+
MathMiscFormulas.prototype.ComputeRAND = function () {
|
|
128
|
+
var args = [];
|
|
129
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
130
|
+
args[_i] = arguments[_i];
|
|
131
|
+
}
|
|
132
|
+
if (args.length === 1 && args[0] === '') {
|
|
133
|
+
args.length = 0;
|
|
134
|
+
}
|
|
135
|
+
if (args.length > 0) {
|
|
136
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
137
|
+
}
|
|
138
|
+
return Math.random().toString();
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Returns an integer random number in a specified range.
|
|
142
|
+
*
|
|
143
|
+
* Excel: `RANDBETWEEN(...)`.
|
|
144
|
+
*
|
|
145
|
+
* @hidden
|
|
146
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
147
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
148
|
+
*/
|
|
149
|
+
MathMiscFormulas.prototype.ComputeRANDBETWEEN = function () {
|
|
150
|
+
var _this = this;
|
|
151
|
+
var args = [];
|
|
152
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
153
|
+
args[_i] = arguments[_i];
|
|
154
|
+
}
|
|
155
|
+
var min;
|
|
156
|
+
var max;
|
|
157
|
+
if (args.length === 1 && args[0] === '') {
|
|
158
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
159
|
+
}
|
|
160
|
+
else if (args.length !== 2) {
|
|
161
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
162
|
+
}
|
|
163
|
+
var errCollection = this.parent.getErrorStrings();
|
|
164
|
+
var processArgs = function (orgValue) {
|
|
165
|
+
var actualValue;
|
|
166
|
+
actualValue = _this.parent.getValueFromArg(orgValue);
|
|
167
|
+
if (errCollection.indexOf(actualValue) > -1) {
|
|
168
|
+
return actualValue;
|
|
169
|
+
}
|
|
170
|
+
if (_this.parent.isCellReference(orgValue)) {
|
|
171
|
+
if (actualValue === '') {
|
|
172
|
+
actualValue = '0';
|
|
173
|
+
}
|
|
174
|
+
else if (orgValue.indexOf(':') > -1 || actualValue.match(/^(\d*\.\d+|\d+)\s*[+\-*/]\s*(\d*\.\d+|\d+)$/)) {
|
|
175
|
+
return errCollection[CommonErrors.Value];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
if (actualValue === '') {
|
|
180
|
+
return errCollection[CommonErrors.NA];
|
|
181
|
+
}
|
|
182
|
+
else if (orgValue.indexOf(_this.parent.tic) > -1 && _this.parent.removeTics(orgValue).match(/^(\d*\.\d+|\d+)\s*[+*]\s*(\d*\.\d+|\d+)$/)) {
|
|
183
|
+
return errCollection[CommonErrors.Value];
|
|
184
|
+
}
|
|
185
|
+
else if (actualValue.indexOf(_this.parent.tic) > -1) {
|
|
186
|
+
actualValue = _this.parent.removeTics(actualValue);
|
|
187
|
+
if (actualValue.indexOf(':') > -1) {
|
|
188
|
+
var values = actualValue.split(':');
|
|
189
|
+
if (values.length <= 3) {
|
|
190
|
+
if (!_this.parent.isNumber(values[0]) || !_this.parent.isNumber(values[1])) {
|
|
191
|
+
return errCollection[CommonErrors.Value];
|
|
192
|
+
}
|
|
193
|
+
var hours = Number(values[0]) + Number((Number(values[1]) / 60));
|
|
194
|
+
if (values.length === 3) {
|
|
195
|
+
if (!_this.parent.isNumber(values[2])) {
|
|
196
|
+
return errCollection[CommonErrors.Value];
|
|
197
|
+
}
|
|
198
|
+
hours += Number(Number(values[2]) / 3600);
|
|
199
|
+
}
|
|
200
|
+
actualValue = (hours / 24).toString();
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
return errCollection[CommonErrors.Value];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (actualValue.split('%').length === 2 && _this.parent.isNumber(actualValue.split('%')[0])) {
|
|
208
|
+
actualValue = (Number(actualValue.split('%')[0]) * 0.01).toString();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
actualValue = parseFloat(actualValue);
|
|
212
|
+
if (isNaN(actualValue)) {
|
|
213
|
+
return errCollection[CommonErrors.Value];
|
|
214
|
+
}
|
|
215
|
+
return actualValue;
|
|
216
|
+
};
|
|
217
|
+
max = processArgs(args[1]);
|
|
218
|
+
if (errCollection.indexOf(max) > -1) {
|
|
219
|
+
return max;
|
|
220
|
+
}
|
|
221
|
+
min = processArgs(args[0]);
|
|
222
|
+
if (errCollection.indexOf(min) > -1) {
|
|
223
|
+
return min;
|
|
224
|
+
}
|
|
225
|
+
if (min === 0 && max === 0) {
|
|
226
|
+
return '0';
|
|
227
|
+
}
|
|
228
|
+
else if (max < min) {
|
|
229
|
+
return errCollection[CommonErrors.Num];
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
min = Math.ceil(min);
|
|
233
|
+
max = Math.floor(max);
|
|
234
|
+
return Math.floor((Math.random() * ((max - min) + 1)) + min);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
/**
|
|
238
|
+
* Converts degrees to radians.
|
|
239
|
+
*
|
|
240
|
+
* Excel: `RADIANS(...)`.
|
|
241
|
+
*
|
|
242
|
+
* @hidden
|
|
243
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
244
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
245
|
+
*/
|
|
246
|
+
MathMiscFormulas.prototype.ComputeRADIANS = function () {
|
|
247
|
+
var args = [];
|
|
248
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
249
|
+
args[_i] = arguments[_i];
|
|
250
|
+
}
|
|
251
|
+
var value;
|
|
252
|
+
var errCollection = this.parent.getErrorStrings();
|
|
253
|
+
if (isNullOrUndefined(args) || (args[0] === '' && args.length === 1) ||
|
|
254
|
+
(args[0].split('!').length === 2 && args[0].indexOf(this.parent.tic) === -1)) {
|
|
255
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
256
|
+
}
|
|
257
|
+
else if (args.length > 1) {
|
|
258
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
259
|
+
}
|
|
260
|
+
else if (args[0].indexOf(':') > -1 || args[0].split(this.parent.tic).join('').trim() === '' ||
|
|
261
|
+
args[0].split(this.parent.tic).join('').trim() === '!' || args[0].split('!').length === 2) {
|
|
262
|
+
return errCollection[CommonErrors.Value];
|
|
263
|
+
}
|
|
264
|
+
value = this.parent.getValueFromArg(args[0]).trim();
|
|
265
|
+
if (errCollection.indexOf(value) > -1) {
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
if ((value.indexOf(this.parent.tic) > -1 && args[0].indexOf(this.parent.tic) === -1) ||
|
|
269
|
+
value.split(this.parent.tic).length > 3) {
|
|
270
|
+
return errCollection[CommonErrors.Value];
|
|
271
|
+
}
|
|
272
|
+
if (value.toUpperCase() === this.parent.trueValue) {
|
|
273
|
+
value = '1';
|
|
274
|
+
}
|
|
275
|
+
else if (value.toUpperCase() === this.parent.falseValue) {
|
|
276
|
+
value = '0';
|
|
277
|
+
}
|
|
278
|
+
else if (value.split('%').length === 2 && this.parent.isNumber(value.split('%')[0])) {
|
|
279
|
+
value = (Number(value.split('%')[0]) / 100).toString();
|
|
280
|
+
}
|
|
281
|
+
value = this.parent.parseFloat(value.split(this.parent.tic).join(''));
|
|
282
|
+
if (!isNaN(value)) {
|
|
283
|
+
value = Math.PI * (value) / 180;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
if (this.parent.isCellReference(args[0]) || args[0].indexOf(this.parent.tic) > -1) {
|
|
287
|
+
return errCollection[CommonErrors.Value];
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
return errCollection[CommonErrors.Name];
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return value;
|
|
294
|
+
};
|
|
295
|
+
/**
|
|
296
|
+
* Converts radians to degrees.
|
|
297
|
+
*
|
|
298
|
+
* Excel: `DEGREES(...)`.
|
|
299
|
+
*
|
|
300
|
+
* @hidden
|
|
301
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
302
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
303
|
+
*/
|
|
304
|
+
MathMiscFormulas.prototype.ComputeDEGREES = function () {
|
|
305
|
+
var args = [];
|
|
306
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
307
|
+
args[_i] = arguments[_i];
|
|
308
|
+
}
|
|
309
|
+
var errCollection = this.parent.getErrorStrings();
|
|
310
|
+
if (isNullOrUndefined(args) || (args[0] === '' && args.length === 1)) {
|
|
311
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
312
|
+
}
|
|
313
|
+
else if (args.length !== 1) {
|
|
314
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
315
|
+
}
|
|
316
|
+
var val = this.parent.getValueFromArg(args[0]).trim();
|
|
317
|
+
if (errCollection.indexOf(val) > -1) {
|
|
318
|
+
return val;
|
|
319
|
+
}
|
|
320
|
+
if (this.parent.isCellReference(args[0])) {
|
|
321
|
+
if (val === '' || val.indexOf(':') > -1) {
|
|
322
|
+
return 0;
|
|
323
|
+
}
|
|
324
|
+
else if (val.indexOf(this.parent.tic) > -1 || (isNaN(Number(val)) && !isNaN(parseInt(val, 10)))) {
|
|
325
|
+
return errCollection[CommonErrors.Value];
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else if (val.indexOf('"TRUE"') > -1) {
|
|
329
|
+
return errCollection[CommonErrors.Value];
|
|
330
|
+
}
|
|
331
|
+
val = val.split(this.parent.tic).join('');
|
|
332
|
+
if (val.toUpperCase() === this.parent.trueValue) {
|
|
333
|
+
val = '1';
|
|
334
|
+
}
|
|
335
|
+
else if (val.toUpperCase() === this.parent.falseValue) {
|
|
336
|
+
val = '0';
|
|
337
|
+
}
|
|
338
|
+
else if (val.indexOf('%') > -1) {
|
|
339
|
+
val = (Number(val.split('%')[0]) / 100).toString();
|
|
340
|
+
}
|
|
341
|
+
else if (val.toUpperCase().match(/[A-Z]/) || isNaN(parseInt(val, 10))) {
|
|
342
|
+
return errCollection[CommonErrors.Value];
|
|
343
|
+
}
|
|
344
|
+
return parseFloat(val) * (180 / (Math.PI));
|
|
345
|
+
};
|
|
346
|
+
/**
|
|
347
|
+
* Returns the value of pi.
|
|
348
|
+
*
|
|
349
|
+
* Excel: `PI(...)`.
|
|
350
|
+
*
|
|
351
|
+
* @hidden
|
|
352
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
353
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
354
|
+
*/
|
|
355
|
+
MathMiscFormulas.prototype.ComputePI = function () {
|
|
356
|
+
var args = [];
|
|
357
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
358
|
+
args[_i] = arguments[_i];
|
|
359
|
+
}
|
|
360
|
+
var result;
|
|
361
|
+
if (args && args[0] !== '') {
|
|
362
|
+
result = this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
result = Math.PI;
|
|
366
|
+
}
|
|
367
|
+
return result;
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* Returns a remainder after a number is divided by divisor.
|
|
371
|
+
*
|
|
372
|
+
* Excel: `MOD(...)`.
|
|
373
|
+
*
|
|
374
|
+
* @hidden
|
|
375
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
376
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
377
|
+
*/
|
|
378
|
+
MathMiscFormulas.prototype.ComputeMOD = function () {
|
|
379
|
+
var args = [];
|
|
380
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
381
|
+
args[_i] = arguments[_i];
|
|
382
|
+
}
|
|
383
|
+
var value;
|
|
384
|
+
if (isNullOrUndefined(args) || args.length !== 2) {
|
|
385
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
386
|
+
}
|
|
387
|
+
if (args[1] === '' && !args[0].includes('"')) {
|
|
388
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.Div];
|
|
389
|
+
}
|
|
390
|
+
else if (args[0] === '' && !args[1].includes('"')) {
|
|
391
|
+
return 0;
|
|
392
|
+
}
|
|
393
|
+
for (var i = 0; i < args.length; i++) {
|
|
394
|
+
var argVal = args[i].split(this.parent.tic).join('').trim();
|
|
395
|
+
if (argVal === '' || (args[i].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(argVal)))) {
|
|
396
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
397
|
+
}
|
|
398
|
+
if (isCellReference(args[i])) {
|
|
399
|
+
value = this.parent.getValueFromArg(args[i]) || '0';
|
|
400
|
+
value = (value === this.parent.trueValue) ? '1' : (value === this.parent.falseValue) ? '0' : value;
|
|
401
|
+
if (value.toUpperCase().match(/[A-Z]/) || value.includes('"') || !this.parent.isNumber(value)) {
|
|
402
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
value = this.parent.getValueFromArg(args[i].split(this.parent.tic).join(''));
|
|
407
|
+
value = (value === this.parent.trueValue) ? '1' : (value === this.parent.falseValue) ? '0' : value;
|
|
408
|
+
if (this.parent.getErrorStrings().indexOf(value) > -1) {
|
|
409
|
+
return value;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
args[i] = value;
|
|
413
|
+
}
|
|
414
|
+
var value1 = args[0];
|
|
415
|
+
var value2 = args[1];
|
|
416
|
+
if (value2 === '0' || value2 === '') {
|
|
417
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.Div];
|
|
418
|
+
}
|
|
419
|
+
else if (value1 === '0' || value1 === '') {
|
|
420
|
+
return 0;
|
|
421
|
+
}
|
|
422
|
+
value1 = parseFloat(value1);
|
|
423
|
+
value2 = parseFloat(value2);
|
|
424
|
+
var result = ((value1 % value2) + value2) % value2;
|
|
425
|
+
if (isNaN(result)) {
|
|
426
|
+
return this.parent.getErrorStrings()[CommonErrors.Name];
|
|
427
|
+
}
|
|
428
|
+
return result;
|
|
429
|
+
};
|
|
430
|
+
/**
|
|
431
|
+
* Returns the factorial of a number.
|
|
432
|
+
*
|
|
433
|
+
* Excel: `FACT(...)`.
|
|
434
|
+
*
|
|
435
|
+
* @hidden
|
|
436
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
437
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
438
|
+
*/
|
|
439
|
+
MathMiscFormulas.prototype.ComputeFACT = function () {
|
|
440
|
+
var args = [];
|
|
441
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
442
|
+
args[_i] = arguments[_i];
|
|
443
|
+
}
|
|
444
|
+
var fact = 1;
|
|
445
|
+
var errCollection = this.parent.getErrorStrings();
|
|
446
|
+
if (args[0] === '') {
|
|
447
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
448
|
+
}
|
|
449
|
+
else if (args.length !== 1) {
|
|
450
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
451
|
+
}
|
|
452
|
+
var getValue = args[0];
|
|
453
|
+
if (this.parent.isCellReference(args[0]) || isNaN(Number(getValue.split(this.parent.tic).join('')))) {
|
|
454
|
+
getValue = this.parent.getValueFromArg(args[0]);
|
|
455
|
+
if (errCollection.indexOf(getValue) > -1) {
|
|
456
|
+
return getValue;
|
|
457
|
+
}
|
|
458
|
+
if (getValue.startsWith(this.parent.tic) ||
|
|
459
|
+
getValue.match(/^(\d*\.\d+|\d+)\s*[+\-*/]\s*(\d*\.\d+|\d+)$/)) {
|
|
460
|
+
return errCollection[CommonErrors.Value];
|
|
461
|
+
}
|
|
462
|
+
else if (getValue === '') {
|
|
463
|
+
return 1;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
getValue = getValue.split(this.parent.tic).join('').trim();
|
|
467
|
+
if (errCollection.indexOf(getValue) > -1) {
|
|
468
|
+
return getValue;
|
|
469
|
+
}
|
|
470
|
+
if (getValue.toUpperCase() === this.parent.trueValue || getValue.toUpperCase() === this.parent.falseValue) {
|
|
471
|
+
return 1;
|
|
472
|
+
}
|
|
473
|
+
if (getValue.indexOf('%') > -1) {
|
|
474
|
+
getValue = (Number(getValue.split('%')[0]) / 100).toString();
|
|
475
|
+
}
|
|
476
|
+
var value = parseInt(getValue, 10);
|
|
477
|
+
if ((value < 0) || (value > 170)) {
|
|
478
|
+
return errCollection[CommonErrors.Num];
|
|
479
|
+
}
|
|
480
|
+
else if (getValue.toUpperCase().match(/[A-Z]/) || getValue === '') {
|
|
481
|
+
return errCollection[CommonErrors.Value];
|
|
482
|
+
}
|
|
483
|
+
else if (getValue.indexOf(':') > -1) {
|
|
484
|
+
return 0;
|
|
485
|
+
}
|
|
486
|
+
for (var i = 1; i <= value; i++) {
|
|
487
|
+
fact = fact * i;
|
|
488
|
+
}
|
|
489
|
+
return fact;
|
|
490
|
+
};
|
|
491
|
+
/**
|
|
492
|
+
* Converts a text representation of a number in a given base into a decimal number.
|
|
493
|
+
*
|
|
494
|
+
* Excel: `DECIMAL(...)`.
|
|
495
|
+
*
|
|
496
|
+
* @hidden
|
|
497
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
498
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
499
|
+
*/
|
|
500
|
+
MathMiscFormulas.prototype.ComputeDECIMAL = function () {
|
|
501
|
+
var args = [];
|
|
502
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
503
|
+
args[_i] = arguments[_i];
|
|
504
|
+
}
|
|
505
|
+
var value;
|
|
506
|
+
var specialChars = /[@#$%^&*()?:{}|<>+-]/g;
|
|
507
|
+
if (isNullOrUndefined(args) || args.length !== 2) {
|
|
508
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
509
|
+
}
|
|
510
|
+
else if (args[0].match(specialChars)) {
|
|
511
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
512
|
+
}
|
|
513
|
+
else if (args[1].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(args[1].split(this.parent.tic).join('')))) {
|
|
514
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
var val = void 0;
|
|
518
|
+
var val1 = void 0;
|
|
519
|
+
if (this.parent.isCellReference(args[0].toString())) {
|
|
520
|
+
val = this.parent.getValueFromArg(args[0]);
|
|
521
|
+
}
|
|
522
|
+
else {
|
|
523
|
+
val = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
|
|
524
|
+
}
|
|
525
|
+
if (this.parent.isCellReference(args[1].toString())) {
|
|
526
|
+
val1 = this.parent.getValueFromArg(args[1]);
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
val1 = this.parent.getValueFromArg(args[1]).split(this.parent.tic).join('');
|
|
530
|
+
}
|
|
531
|
+
var num = parseInt(val, 10);
|
|
532
|
+
var radix = parseInt(val1, 10);
|
|
533
|
+
if (this.parent.getErrorStrings().indexOf(val) > -1) {
|
|
534
|
+
return val;
|
|
535
|
+
}
|
|
536
|
+
else if (this.parent.getErrorStrings().indexOf(val1) > -1) {
|
|
537
|
+
return val1;
|
|
538
|
+
}
|
|
539
|
+
else if (val === '' && val1 !== '') {
|
|
540
|
+
return 0;
|
|
541
|
+
}
|
|
542
|
+
else if (val === '' || (num < 0) || (!isNaN(num) && !Number.isInteger(parseFloat(val)))) {
|
|
543
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
544
|
+
}
|
|
545
|
+
else if (val1 === '' || (radix < 2 || radix > 36) || isNaN(radix)) {
|
|
546
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
547
|
+
}
|
|
548
|
+
else if (isNaN(this.parent.parseFloat(val)) && this.parent.parseFloat(val1) <= 10) {
|
|
549
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
550
|
+
}
|
|
551
|
+
value = parseInt(val, parseInt(val1, 10));
|
|
552
|
+
}
|
|
553
|
+
return isNaN(value) ? this.parent.getErrorStrings()[CommonErrors.Num] : value;
|
|
554
|
+
};
|
|
555
|
+
/**
|
|
556
|
+
* Returns the natural logarithm of a number.
|
|
557
|
+
*
|
|
558
|
+
* Excel: `LN(...)`.
|
|
559
|
+
*
|
|
560
|
+
* @hidden
|
|
561
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
562
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
563
|
+
*/
|
|
564
|
+
MathMiscFormulas.prototype.ComputeLN = function () {
|
|
565
|
+
var args = [];
|
|
566
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
567
|
+
args[_i] = arguments[_i];
|
|
568
|
+
}
|
|
569
|
+
var cellvalue;
|
|
570
|
+
var errCollection = this.parent.getErrorStrings();
|
|
571
|
+
if (isNullOrUndefined(args) || (args[0] === '' && args.length === 1)) {
|
|
572
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
573
|
+
}
|
|
574
|
+
else if (args.length === 0 || args.length > 1) {
|
|
575
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
576
|
+
}
|
|
577
|
+
cellvalue = this.parent.getValueFromArg(args[0]);
|
|
578
|
+
if (errCollection.indexOf(cellvalue) > -1) {
|
|
579
|
+
return cellvalue;
|
|
580
|
+
}
|
|
581
|
+
if (cellvalue.toUpperCase() === this.parent.trueValue) {
|
|
582
|
+
cellvalue = '1';
|
|
583
|
+
}
|
|
584
|
+
else if (cellvalue.toUpperCase() === this.parent.falseValue) {
|
|
585
|
+
cellvalue = '0';
|
|
586
|
+
}
|
|
587
|
+
if (!this.parent.isCellReference(args[0])) {
|
|
588
|
+
cellvalue = this.parent.removeTics(cellvalue);
|
|
589
|
+
if (cellvalue.trim() === '') {
|
|
590
|
+
return errCollection[CommonErrors.Value];
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
if (cellvalue.split('%').length === 2 && this.parent.isNumber(cellvalue.split('%')[0])) {
|
|
594
|
+
cellvalue = (Number(cellvalue.split('%')[0]) * 0.01).toString();
|
|
595
|
+
}
|
|
596
|
+
cellvalue = this.parent.parseFloat(cellvalue);
|
|
597
|
+
if (cellvalue <= 0) {
|
|
598
|
+
return errCollection[CommonErrors.Num];
|
|
599
|
+
}
|
|
600
|
+
else if (isNaN(cellvalue)) {
|
|
601
|
+
return errCollection[CommonErrors.Value];
|
|
602
|
+
}
|
|
603
|
+
return Math.log(cellvalue);
|
|
604
|
+
};
|
|
605
|
+
/**
|
|
606
|
+
* Returns the logarithm of a number to the base that you specify.
|
|
607
|
+
*
|
|
608
|
+
* Excel: `LOG(...)`.
|
|
609
|
+
*
|
|
610
|
+
* @hidden
|
|
611
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
612
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
613
|
+
*/
|
|
614
|
+
MathMiscFormulas.prototype.ComputeLOG = function () {
|
|
615
|
+
var _this = this;
|
|
616
|
+
var args = [];
|
|
617
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
618
|
+
args[_i] = arguments[_i];
|
|
619
|
+
}
|
|
620
|
+
var orgNumValue;
|
|
621
|
+
var orgBaseValue;
|
|
622
|
+
var errCollection = this.parent.getErrorStrings();
|
|
623
|
+
if (isNullOrUndefined(args) || (args.length === 1 && args[0] === '')) {
|
|
624
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
625
|
+
}
|
|
626
|
+
else if (args.length > 2) {
|
|
627
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
628
|
+
}
|
|
629
|
+
var processArgs = function (orgValue) {
|
|
630
|
+
var actualValue = _this.parent.getValueFromArg(orgValue);
|
|
631
|
+
if (actualValue === _this.parent.trueValue) {
|
|
632
|
+
actualValue = '1';
|
|
633
|
+
}
|
|
634
|
+
else if (actualValue === _this.parent.falseValue) {
|
|
635
|
+
actualValue = '0';
|
|
636
|
+
}
|
|
637
|
+
if (!_this.parent.isCellReference(orgValue) && actualValue !== '') {
|
|
638
|
+
if (actualValue.indexOf(_this.parent.tic) > -1 && errCollection.indexOf(actualValue.split(_this.parent.tic).join('')) === -1) {
|
|
639
|
+
actualValue = _this.parent.removeTics(actualValue);
|
|
640
|
+
if (actualValue.trim() === '') {
|
|
641
|
+
return errCollection[CommonErrors.Value];
|
|
642
|
+
}
|
|
643
|
+
else if (actualValue.indexOf(':') > -1) {
|
|
644
|
+
var values = actualValue.split(':');
|
|
645
|
+
if (values.length <= 3) {
|
|
646
|
+
if (!_this.parent.isNumber(values[0]) || !_this.parent.isNumber(values[1])) {
|
|
647
|
+
return errCollection[CommonErrors.Value];
|
|
648
|
+
}
|
|
649
|
+
var hours = Number(values[0]) + Number((Number(values[1]) / 60));
|
|
650
|
+
if (values.length === 3) {
|
|
651
|
+
if (!_this.parent.isNumber(values[2])) {
|
|
652
|
+
return errCollection[CommonErrors.Value];
|
|
653
|
+
}
|
|
654
|
+
hours += Number(Number(values[2]) / 3600);
|
|
655
|
+
}
|
|
656
|
+
actualValue = (hours / 24).toString();
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
return errCollection[CommonErrors.Value];
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
if (actualValue.split('%').length === 2 && _this.parent.isNumber(actualValue.split('%')[0])) {
|
|
664
|
+
actualValue = (Number(actualValue.split('%')[0]) * 0.01).toString();
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
return actualValue;
|
|
668
|
+
};
|
|
669
|
+
if (!isNullOrUndefined(args[0])) {
|
|
670
|
+
orgNumValue = processArgs(args[0]);
|
|
671
|
+
if (errCollection.indexOf(orgNumValue) > -1) {
|
|
672
|
+
return orgNumValue;
|
|
673
|
+
}
|
|
674
|
+
orgNumValue = this.parent.parseFloat(orgNumValue);
|
|
675
|
+
}
|
|
676
|
+
orgBaseValue = 10;
|
|
677
|
+
if (!isNullOrUndefined(args[1])) {
|
|
678
|
+
orgBaseValue = processArgs(args[1]);
|
|
679
|
+
if (errCollection.indexOf(orgBaseValue) > -1) {
|
|
680
|
+
return orgBaseValue;
|
|
681
|
+
}
|
|
682
|
+
orgBaseValue = this.parent.parseFloat(orgBaseValue);
|
|
683
|
+
}
|
|
684
|
+
orgNumValue = Number(orgNumValue);
|
|
685
|
+
if (isNaN(orgNumValue) || isNaN(orgBaseValue)) {
|
|
686
|
+
return errCollection[CommonErrors.Value];
|
|
687
|
+
}
|
|
688
|
+
else if (orgNumValue <= 0 || orgBaseValue <= 0) {
|
|
689
|
+
return errCollection[CommonErrors.Num];
|
|
690
|
+
}
|
|
691
|
+
else if (orgBaseValue === 1) {
|
|
692
|
+
return errCollection[CommonErrors.DivZero];
|
|
693
|
+
}
|
|
694
|
+
return ((Math.log(orgNumValue) / Math.LN10) / (Math.log(orgBaseValue) / Math.LN10)).toString();
|
|
695
|
+
};
|
|
696
|
+
/**
|
|
697
|
+
* Returns the result of a number raised to power.
|
|
698
|
+
*
|
|
699
|
+
* Excel: `POWER(...)`.
|
|
700
|
+
*
|
|
701
|
+
* @hidden
|
|
702
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
703
|
+
* @returns {boolean} - Boolean result, nested-formula numeric string (`"0"`/`"1"`), or an Excel error token.
|
|
704
|
+
*/
|
|
705
|
+
MathMiscFormulas.prototype.ComputePOWER = function () {
|
|
706
|
+
var _this = this;
|
|
707
|
+
var args = [];
|
|
708
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
709
|
+
args[_i] = arguments[_i];
|
|
710
|
+
}
|
|
711
|
+
var power;
|
|
712
|
+
var errCollection = this.parent.getErrorStrings();
|
|
713
|
+
if (isNullOrUndefined(args) || (args.length === 1 && args[0].trim() === '')) {
|
|
714
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
715
|
+
}
|
|
716
|
+
else if (args.length > 2) {
|
|
717
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
718
|
+
}
|
|
719
|
+
else if (args[0].trim() === '' && args[1].trim() === '') {
|
|
720
|
+
return errCollection[CommonErrors.Num];
|
|
721
|
+
}
|
|
722
|
+
var processArgs = function (actualValue) {
|
|
723
|
+
var value = _this.parent.getValueFromArg(actualValue);
|
|
724
|
+
if (errCollection.indexOf(value) > -1) {
|
|
725
|
+
return value;
|
|
726
|
+
}
|
|
727
|
+
if (value.toUpperCase() === _this.parent.trueValue) {
|
|
728
|
+
value = '1';
|
|
729
|
+
}
|
|
730
|
+
else if (value.toUpperCase() === _this.parent.falseValue) {
|
|
731
|
+
value = '0';
|
|
732
|
+
}
|
|
733
|
+
if (value.indexOf(_this.parent.tic) > -1) {
|
|
734
|
+
value = _this.parent.removeTics(value);
|
|
735
|
+
if (actualValue.indexOf(_this.parent.tic) === -1 || value.trim() === '') {
|
|
736
|
+
return errCollection[CommonErrors.Value];
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
if (value.split('%').length === 2 && _this.parent.isNumber(value.split('%')[0])) {
|
|
740
|
+
value = (Number(value.split('%')[0]) / 100).toString();
|
|
741
|
+
}
|
|
742
|
+
else if (value.indexOf('/') > -1 && _this.parent.isNumber(value.split('/').join(''))) {
|
|
743
|
+
return errCollection[CommonErrors.Num];
|
|
744
|
+
}
|
|
745
|
+
value = _this.parent.parseFloat(value);
|
|
746
|
+
if (isNaN(value)) {
|
|
747
|
+
return errCollection[CommonErrors.Value];
|
|
748
|
+
}
|
|
749
|
+
return value;
|
|
750
|
+
};
|
|
751
|
+
var numValue = processArgs(args[0]);
|
|
752
|
+
if (errCollection.indexOf(numValue) > -1) {
|
|
753
|
+
return numValue;
|
|
754
|
+
}
|
|
755
|
+
var powValue = processArgs(args[1]);
|
|
756
|
+
if (errCollection.indexOf(powValue) > -1) {
|
|
757
|
+
return powValue;
|
|
758
|
+
}
|
|
759
|
+
if (!isNaN(numValue) && !isNaN(powValue)) {
|
|
760
|
+
if (numValue === 0 && powValue < 0) {
|
|
761
|
+
return errCollection[CommonErrors.DivZero];
|
|
762
|
+
}
|
|
763
|
+
if (numValue === 0 && powValue === 0) {
|
|
764
|
+
return errCollection[CommonErrors.Num];
|
|
765
|
+
}
|
|
766
|
+
power = Math.pow(numValue, powValue);
|
|
767
|
+
if (isNaN(power) || power === Infinity) {
|
|
768
|
+
return errCollection[CommonErrors.Num];
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
else {
|
|
772
|
+
return errCollection[CommonErrors.Value];
|
|
773
|
+
}
|
|
774
|
+
return power.toString();
|
|
775
|
+
};
|
|
776
|
+
/**
|
|
777
|
+
* Returns the square root of a positive number.
|
|
778
|
+
*
|
|
779
|
+
* Excel: `SQRT(...)`.
|
|
780
|
+
*
|
|
781
|
+
* @hidden
|
|
782
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
783
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
784
|
+
*/
|
|
785
|
+
MathMiscFormulas.prototype.ComputeSQRT = function () {
|
|
786
|
+
var args = [];
|
|
787
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
788
|
+
args[_i] = arguments[_i];
|
|
789
|
+
}
|
|
790
|
+
var sqrtValue;
|
|
791
|
+
var arrValue = args[0];
|
|
792
|
+
if (args.length === 0 || args.length > 1 || arrValue === '') {
|
|
793
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
794
|
+
}
|
|
795
|
+
else if (arrValue.split(this.parent.tic).join('').trim() === '') {
|
|
796
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
797
|
+
}
|
|
798
|
+
if (this.parent.isCellReference(arrValue)) {
|
|
799
|
+
sqrtValue = this.parent.getValueFromArg(arrValue) || '0';
|
|
800
|
+
if (sqrtValue.indexOf(this.parent.tic) > -1) {
|
|
801
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
else {
|
|
805
|
+
if (arrValue.indexOf(this.parent.tic) > -1 && (arrValue.split(this.parent.tic).join('') === this.parent.trueValue ||
|
|
806
|
+
arrValue.split(this.parent.tic).join('') === this.parent.falseValue)) {
|
|
807
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
808
|
+
}
|
|
809
|
+
sqrtValue = this.parent.getValueFromArg(arrValue).split(this.parent.tic).join('');
|
|
810
|
+
}
|
|
811
|
+
if (this.parent.getErrorStrings().indexOf(sqrtValue) > -1) {
|
|
812
|
+
return sqrtValue;
|
|
813
|
+
}
|
|
814
|
+
sqrtValue = sqrtValue === this.parent.trueValue ? '1' : sqrtValue === this.parent.falseValue ? '0' : sqrtValue;
|
|
815
|
+
var parsedValue = this.parent.parseFloat(sqrtValue);
|
|
816
|
+
if (parsedValue < 0) {
|
|
817
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
818
|
+
}
|
|
819
|
+
else if (isNaN(parsedValue) ||
|
|
820
|
+
(arrValue.indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(arrValue)))) {
|
|
821
|
+
var dateTimeCheck = this.parent.hostParseDate(isNaN(parsedValue) ?
|
|
822
|
+
sqrtValue : arrValue.split(this.parent.tic).join(''));
|
|
823
|
+
if (dateTimeCheck.isDate || dateTimeCheck.isTime) {
|
|
824
|
+
sqrtValue = dateTimeCheck.value;
|
|
825
|
+
}
|
|
826
|
+
else {
|
|
827
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
return Math.sqrt(this.parent.parseFloat(sqrtValue));
|
|
831
|
+
};
|
|
832
|
+
/**
|
|
833
|
+
* Returns e raised to the power of the given number.
|
|
834
|
+
*
|
|
835
|
+
* Excel: `EXP(...)`.
|
|
836
|
+
*
|
|
837
|
+
* @hidden
|
|
838
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
839
|
+
* @returns {boolean} - Boolean result, nested-formula numeric string (`"0"`/`"1"`), or an Excel error token.
|
|
840
|
+
*/
|
|
841
|
+
MathMiscFormulas.prototype.ComputeEXP = function () {
|
|
842
|
+
var args = [];
|
|
843
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
844
|
+
args[_i] = arguments[_i];
|
|
845
|
+
}
|
|
846
|
+
var orgNumValue;
|
|
847
|
+
var errCollection = this.parent.getErrorStrings();
|
|
848
|
+
if (args[0] === '' && args.length === 1) {
|
|
849
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
850
|
+
}
|
|
851
|
+
else if (args.length !== 1) {
|
|
852
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
853
|
+
}
|
|
854
|
+
else if (args[0].split(this.parent.tic).join('').trim() === '') {
|
|
855
|
+
return errCollection[CommonErrors.Value];
|
|
856
|
+
}
|
|
857
|
+
orgNumValue = this.parent.getValueFromArg(args[0]);
|
|
858
|
+
if (errCollection.indexOf(orgNumValue) > -1) {
|
|
859
|
+
return orgNumValue;
|
|
860
|
+
}
|
|
861
|
+
if (orgNumValue.indexOf(this.parent.tic) > -1 && (this.parent.isCellReference(args[0]) ||
|
|
862
|
+
isNaN(Number(orgNumValue.split(this.parent.tic).join(''))))) {
|
|
863
|
+
return errCollection[CommonErrors.Value];
|
|
864
|
+
}
|
|
865
|
+
orgNumValue = orgNumValue.split(this.parent.tic).join('');
|
|
866
|
+
if (orgNumValue === this.parent.trueValue) {
|
|
867
|
+
orgNumValue = '1';
|
|
868
|
+
}
|
|
869
|
+
else if ((orgNumValue === this.parent.falseValue) || (orgNumValue === '')) {
|
|
870
|
+
orgNumValue = '0';
|
|
871
|
+
}
|
|
872
|
+
else if (orgNumValue.indexOf('%') > -1) {
|
|
873
|
+
orgNumValue = (Number(orgNumValue.split('%')[0]) / 100).toString();
|
|
874
|
+
}
|
|
875
|
+
else if (orgNumValue.indexOf(':') > -1) {
|
|
876
|
+
return '0';
|
|
877
|
+
}
|
|
878
|
+
var logNumValue = this.parent.parseFloat(orgNumValue);
|
|
879
|
+
if (isNaN(logNumValue)) {
|
|
880
|
+
return errCollection[CommonErrors.Value];
|
|
881
|
+
}
|
|
882
|
+
else if (logNumValue > 709) {
|
|
883
|
+
return errCollection[CommonErrors.Num];
|
|
884
|
+
}
|
|
885
|
+
return Math.exp(logNumValue).toString();
|
|
886
|
+
};
|
|
887
|
+
return MathMiscFormulas;
|
|
888
|
+
}(FormulaModuleBase));
|
|
889
|
+
export { MathMiscFormulas };
|