@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.
Files changed (173) hide show
  1. package/.eslintrc.json +263 -0
  2. package/README.md +132 -0
  3. package/base.d.ts +4 -0
  4. package/base.js +4 -0
  5. package/common.d.ts +4 -0
  6. package/common.js +4 -0
  7. package/dist/ej2-calculate.umd.min.js +11 -0
  8. package/dist/ej2-calculate.umd.min.js.map +1 -0
  9. package/dist/es6/ej2-calculate.es2015.js +24801 -0
  10. package/dist/es6/ej2-calculate.es2015.js.map +1 -0
  11. package/dist/es6/ej2-calculate.es5.js +27229 -0
  12. package/dist/es6/ej2-calculate.es5.js.map +1 -0
  13. package/dist/global/ej2-calculate.min.js +11 -0
  14. package/dist/global/ej2-calculate.min.js.map +1 -0
  15. package/dist/global/index.d.ts +14 -0
  16. package/formulas.d.ts +4 -0
  17. package/formulas.js +4 -0
  18. package/index.d.ts +4 -0
  19. package/index.js +4 -0
  20. package/license +10 -0
  21. package/package.json +30 -0
  22. package/src/base/calculate-model.d.ts +4 -0
  23. package/src/base/calculate-model.js +0 -0
  24. package/src/base/calculate.d.ts +1105 -0
  25. package/src/base/calculate.js +4720 -0
  26. package/src/base/index.d.ts +8 -0
  27. package/src/base/index.js +7 -0
  28. package/src/base/parser.d.ts +208 -0
  29. package/src/base/parser.js +1512 -0
  30. package/src/common/address.d.ts +59 -0
  31. package/src/common/address.js +96 -0
  32. package/src/common/cell-ref.d.ts +32 -0
  33. package/src/common/cell-ref.js +112 -0
  34. package/src/common/common.d.ts +44 -0
  35. package/src/common/common.js +134 -0
  36. package/src/common/enum.d.ts +94 -0
  37. package/src/common/enum.js +97 -0
  38. package/src/common/index.d.ts +9 -0
  39. package/src/common/index.js +8 -0
  40. package/src/common/interface.d.ts +122 -0
  41. package/src/common/interface.js +0 -0
  42. package/src/common/l10n.d.ts +24 -0
  43. package/src/common/l10n.js +54 -0
  44. package/src/common/number-date.d.ts +26 -0
  45. package/src/common/number-date.js +38 -0
  46. package/src/common/sheet-info.d.ts +10 -0
  47. package/src/common/sheet-info.js +17 -0
  48. package/src/common/sort.d.ts +17 -0
  49. package/src/common/sort.js +44 -0
  50. package/src/formulas/array.d.ts +47 -0
  51. package/src/formulas/array.js +718 -0
  52. package/src/formulas/basic.d.ts +47 -0
  53. package/src/formulas/basic.js +181 -0
  54. package/src/formulas/complex-numbers.d.ts +207 -0
  55. package/src/formulas/complex-numbers.js +549 -0
  56. package/src/formulas/database.d.ts +152 -0
  57. package/src/formulas/database.js +579 -0
  58. package/src/formulas/date-time-extra.d.ts +97 -0
  59. package/src/formulas/date-time-extra.js +415 -0
  60. package/src/formulas/date-time-intl.d.ts +57 -0
  61. package/src/formulas/date-time-intl.js +309 -0
  62. package/src/formulas/date-time.d.ts +164 -0
  63. package/src/formulas/date-time.js +1021 -0
  64. package/src/formulas/engineering-base.d.ts +150 -0
  65. package/src/formulas/engineering-base.js +404 -0
  66. package/src/formulas/engineering-bessel.d.ts +65 -0
  67. package/src/formulas/engineering-bessel.js +167 -0
  68. package/src/formulas/engineering-convert.d.ts +35 -0
  69. package/src/formulas/engineering-convert.js +120 -0
  70. package/src/formulas/engineering-misc.d.ts +64 -0
  71. package/src/formulas/engineering-misc.js +168 -0
  72. package/src/formulas/financial-amortization-ecma.d.ts +87 -0
  73. package/src/formulas/financial-amortization-ecma.js +288 -0
  74. package/src/formulas/financial-annuity.d.ts +104 -0
  75. package/src/formulas/financial-annuity.js +419 -0
  76. package/src/formulas/financial-bond-helpers.d.ts +106 -0
  77. package/src/formulas/financial-bond-helpers.js +190 -0
  78. package/src/formulas/financial-cashflow.d.ts +47 -0
  79. package/src/formulas/financial-cashflow.js +203 -0
  80. package/src/formulas/financial-coupons.d.ts +227 -0
  81. package/src/formulas/financial-coupons.js +810 -0
  82. package/src/formulas/financial-depreciation.d.ts +64 -0
  83. package/src/formulas/financial-depreciation.js +247 -0
  84. package/src/formulas/financial-rates.d.ts +54 -0
  85. package/src/formulas/financial-rates.js +140 -0
  86. package/src/formulas/financial-securities.d.ts +126 -0
  87. package/src/formulas/financial-securities.js +488 -0
  88. package/src/formulas/formula-math-helpers.d.ts +212 -0
  89. package/src/formulas/formula-math-helpers.js +599 -0
  90. package/src/formulas/formula-module-base.d.ts +54 -0
  91. package/src/formulas/formula-module-base.js +125 -0
  92. package/src/formulas/formula-owner.d.ts +17 -0
  93. package/src/formulas/formula-owner.js +0 -0
  94. package/src/formulas/index.d.ts +68 -0
  95. package/src/formulas/index.js +67 -0
  96. package/src/formulas/information-advanced.d.ts +44 -0
  97. package/src/formulas/information-advanced.js +157 -0
  98. package/src/formulas/information-ecma.d.ts +33 -0
  99. package/src/formulas/information-ecma.js +88 -0
  100. package/src/formulas/information-extra.d.ts +146 -0
  101. package/src/formulas/information-extra.js +351 -0
  102. package/src/formulas/information.d.ts +34 -0
  103. package/src/formulas/information.js +78 -0
  104. package/src/formulas/logical-extra.d.ts +75 -0
  105. package/src/formulas/logical-extra.js +217 -0
  106. package/src/formulas/logical.d.ts +83 -0
  107. package/src/formulas/logical.js +296 -0
  108. package/src/formulas/lookup-array.d.ts +98 -0
  109. package/src/formulas/lookup-array.js +364 -0
  110. package/src/formulas/lookup-ref-extra.d.ts +64 -0
  111. package/src/formulas/lookup-ref-extra.js +180 -0
  112. package/src/formulas/lookup-ref.d.ts +84 -0
  113. package/src/formulas/lookup-ref.js +263 -0
  114. package/src/formulas/lookup.d.ts +114 -0
  115. package/src/formulas/lookup.js +881 -0
  116. package/src/formulas/math-aggregate.d.ts +74 -0
  117. package/src/formulas/math-aggregate.js +376 -0
  118. package/src/formulas/math-ceiling-ecma.d.ts +42 -0
  119. package/src/formulas/math-ceiling-ecma.js +123 -0
  120. package/src/formulas/math-combinatorics.d.ts +75 -0
  121. package/src/formulas/math-combinatorics.js +290 -0
  122. package/src/formulas/math-misc.d.ts +164 -0
  123. package/src/formulas/math-misc.js +889 -0
  124. package/src/formulas/math-number.d.ts +76 -0
  125. package/src/formulas/math-number.js +261 -0
  126. package/src/formulas/math-rounding.d.ts +115 -0
  127. package/src/formulas/math-rounding.js +728 -0
  128. package/src/formulas/math-trig-hyperbolic.d.ts +55 -0
  129. package/src/formulas/math-trig-hyperbolic.js +113 -0
  130. package/src/formulas/math-trig.d.ts +165 -0
  131. package/src/formulas/math-trig.js +334 -0
  132. package/src/formulas/matrix-base.d.ts +13 -0
  133. package/src/formulas/matrix-base.js +169 -0
  134. package/src/formulas/matrix.d.ts +64 -0
  135. package/src/formulas/matrix.js +161 -0
  136. package/src/formulas/regression-ecma.d.ts +66 -0
  137. package/src/formulas/regression-ecma.js +234 -0
  138. package/src/formulas/statistical-advanced.d.ts +125 -0
  139. package/src/formulas/statistical-advanced.js +756 -0
  140. package/src/formulas/statistical-correlation.d.ts +75 -0
  141. package/src/formulas/statistical-correlation.js +198 -0
  142. package/src/formulas/statistical-dispersion.d.ts +108 -0
  143. package/src/formulas/statistical-dispersion.js +337 -0
  144. package/src/formulas/statistical-distribution-extended.d.ts +176 -0
  145. package/src/formulas/statistical-distribution-extended.js +668 -0
  146. package/src/formulas/statistical-distribution.d.ts +104 -0
  147. package/src/formulas/statistical-distribution.js +368 -0
  148. package/src/formulas/statistical-ecma.d.ts +95 -0
  149. package/src/formulas/statistical-ecma.js +392 -0
  150. package/src/formulas/statistical-extended.d.ts +136 -0
  151. package/src/formulas/statistical-extended.js +340 -0
  152. package/src/formulas/statistical-ifs.d.ts +46 -0
  153. package/src/formulas/statistical-ifs.js +180 -0
  154. package/src/formulas/statistical-moments.d.ts +84 -0
  155. package/src/formulas/statistical-moments.js +269 -0
  156. package/src/formulas/statistical-percentile.d.ts +56 -0
  157. package/src/formulas/statistical-percentile.js +195 -0
  158. package/src/formulas/statistical-sample-base.d.ts +14 -0
  159. package/src/formulas/statistical-sample-base.js +124 -0
  160. package/src/formulas/statistical.d.ts +135 -0
  161. package/src/formulas/statistical.js +542 -0
  162. package/src/formulas/text-advanced.d.ts +64 -0
  163. package/src/formulas/text-advanced.js +222 -0
  164. package/src/formulas/text-ecma.d.ts +54 -0
  165. package/src/formulas/text-ecma.js +106 -0
  166. package/src/formulas/text-extra.d.ts +216 -0
  167. package/src/formulas/text-extra.js +657 -0
  168. package/src/formulas/text.d.ts +125 -0
  169. package/src/formulas/text.js +628 -0
  170. package/src/global.js +1 -0
  171. package/src/index.d.ts +14 -0
  172. package/src/index.js +14 -0
  173. package/tslint.json +111 -0
@@ -0,0 +1,728 @@
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
+ * Rounding and truncation functions for numeric precision control, including CEILING, FLOOR, ROUND, and TRUNC variants.
20
+ *
21
+ * Registers 9 functions including ROUND, ROUNDUP, ROUNDDOWN, FLOOR, CEILING, and others.
22
+ *
23
+ * @hidden
24
+ */
25
+ var MathRoundingFormulas = /** @class */ (function (_super) {
26
+ __extends(MathRoundingFormulas, _super);
27
+ /**
28
+ * @hidden
29
+ * @param {FormulaOwner} owner - Formula registration owner ({@link BasicFormulas}).
30
+ */
31
+ function MathRoundingFormulas(owner) {
32
+ var _this = _super.call(this, owner) || this;
33
+ /** Formula definitions registered with {@link BasicFormulas}. */
34
+ _this.formulas = [
35
+ { formulaName: 'ROUND', category: 'Math & Trig', description: 'Rounds a number to a specified number of digits.' },
36
+ { formulaName: 'ROUNDUP', category: 'Math & Trig', description: 'Rounds a number away from zero.' },
37
+ { formulaName: 'ROUNDDOWN', category: 'Math & Trig', description: 'Rounds a number down, toward zero.' },
38
+ { formulaName: 'FLOOR', category: 'Math & Trig', description: 'Returns the round a number down to the nearest integer.' },
39
+ { formulaName: 'CEILING', category: 'Math & Trig', description: 'Returns a number rounded up to a multiple of another number.' },
40
+ { formulaName: 'INT', category: 'Math & Trig', description: 'Returns a number to the nearest integer.' },
41
+ { formulaName: 'TRUNC', category: 'Math & Trig', description: 'Returns the truncated value of a number to a specified number of decimal places.' },
42
+ { formulaName: 'ODD', category: 'Math & Trig', description: 'Rounds a positive number up and negative number down to the nearest odd integer.' },
43
+ { formulaName: 'EVEN', category: 'Math & Trig', description: 'Rounds a positive number up and negative number down to the nearest even integer.' }
44
+ ];
45
+ return _this;
46
+ }
47
+ /**
48
+ * Rounds a number to a specified number of digits.
49
+ *
50
+ * Excel: `ROUND(...)`.
51
+ *
52
+ * @hidden
53
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
54
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * engine.computeFormula('=ROUND(3.1415,2)');
59
+ * ```
60
+ */
61
+ MathRoundingFormulas.prototype.ComputeROUND = function () {
62
+ var args = [];
63
+ for (var _i = 0; _i < arguments.length; _i++) {
64
+ args[_i] = arguments[_i];
65
+ }
66
+ if (!args.length || args.length === 1 || args.length > 2) {
67
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
68
+ }
69
+ var argArr = args;
70
+ if (args.length === 1) {
71
+ var orgValue = (argArr[0].split(this.parent.tic).join('') === 'TRUE')
72
+ ? '1'
73
+ : (argArr[0].split(this.parent.tic).join('') === 'FALSE')
74
+ ? '0'
75
+ : argArr[0];
76
+ if (isNaN(this.parent.parseFloat(orgValue))) {
77
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
78
+ }
79
+ return Math.round(this.parent.parseFloat(orgValue)).toString();
80
+ }
81
+ var numStr = this.parent.getValueFromArg(argArr[0]);
82
+ if (this.parent.getErrorStrings().indexOf(numStr) > -1) {
83
+ return numStr;
84
+ }
85
+ var digStr = this.parent.getValueFromArg(argArr[1]);
86
+ if (this.parent.getErrorStrings().indexOf(digStr) > -1) {
87
+ return digStr;
88
+ }
89
+ numStr = numStr === 'TRUE' ? '1' : numStr === 'FALSE' ? '0' : numStr;
90
+ digStr = digStr === 'TRUE' ? '1' : digStr === 'FALSE' ? '0' : digStr;
91
+ numStr = numStr.split(this.parent.tic).join('');
92
+ digStr = digStr.split(this.parent.tic).join('');
93
+ var isInvalidNumStr = isNaN(Number(numStr)) || numStr.trim() === '';
94
+ var isInvalidDigStr = isNaN(Number(digStr)) || digStr.trim() === '';
95
+ if (((argArr[0].indexOf('"') > -1 || this.parent.isCellReference(argArr[0])) && isInvalidNumStr)
96
+ || ((argArr[1].indexOf('"') > -1 || this.parent.isCellReference(argArr[1])) && isInvalidDigStr)) {
97
+ return this.parent.getErrorStrings()[CommonErrors.Value];
98
+ }
99
+ if ((numStr === '' && digStr === '') || numStr === '') {
100
+ return 0;
101
+ }
102
+ var x = this.parent.parseFloat(numStr);
103
+ var digits = this.parent.parseFloat(digStr);
104
+ var round;
105
+ if (!isNaN(digits) && !isNaN(x) && digits > 0) {
106
+ round = this.parent.parseFloat(this.preciseRound(x, digits, 'ROUND'));
107
+ }
108
+ else {
109
+ var mult = Math.pow(10, -digits);
110
+ round = Math.round(x / mult) * mult;
111
+ }
112
+ return round.toString();
113
+ };
114
+ MathRoundingFormulas.prototype.preciseRound = function (numValue, decimalValue, formula) {
115
+ var factor = Math.pow(10, decimalValue);
116
+ var absValue = Math.abs(numValue) * factor;
117
+ var sign = numValue >= 0 ? 1 : -1;
118
+ var result = formula === 'ROUND' ? Math.round(absValue) : formula === 'ROUNDDOWN' ?
119
+ Math.floor(absValue) : Math.ceil(absValue);
120
+ return (sign * (result / factor)).toFixed(decimalValue);
121
+ };
122
+ /**
123
+ * Rounds a number away from zero.
124
+ *
125
+ * Excel: `ROUNDUP(...)`.
126
+ *
127
+ * @hidden
128
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
129
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
130
+ */
131
+ MathRoundingFormulas.prototype.ComputeROUNDUP = function () {
132
+ var args = [];
133
+ for (var _i = 0; _i < arguments.length; _i++) {
134
+ args[_i] = arguments[_i];
135
+ }
136
+ var str;
137
+ var arg1;
138
+ var arg2;
139
+ var num;
140
+ var len = args.length;
141
+ if (len === 1 && args[0] === '') {
142
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
143
+ }
144
+ else if (len !== 2) {
145
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
146
+ }
147
+ if (this.parent.isCellReference(args[0])) {
148
+ arg1 = this.parent.getValueFromArg(args[0]) || '0';
149
+ }
150
+ else {
151
+ if (args[0].indexOf(this.parent.tic) > -1 && (args[0].split(this.parent.tic).join('') === this.parent.trueValue ||
152
+ args[0].split(this.parent.tic).join('') === this.parent.falseValue)) {
153
+ return this.parent.getErrorStrings()[CommonErrors.Value];
154
+ }
155
+ arg1 = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
156
+ }
157
+ if (this.parent.getErrorStrings().indexOf(arg1) > -1) {
158
+ return arg1;
159
+ }
160
+ if (this.parent.isCellReference(args[1])) {
161
+ arg2 = this.parent.getValueFromArg(args[1]) || '0';
162
+ }
163
+ else {
164
+ if (args[1].indexOf(this.parent.tic) > -1 && (args[1].split(this.parent.tic).join('') === this.parent.trueValue ||
165
+ args[1].split(this.parent.tic).join('') === this.parent.falseValue)) {
166
+ return this.parent.getErrorStrings()[CommonErrors.Value];
167
+ }
168
+ arg2 = this.parent.getValueFromArg(args[1]).split(this.parent.tic).join('');
169
+ }
170
+ if (this.parent.getErrorStrings().indexOf(arg2) > -1) {
171
+ return arg2;
172
+ }
173
+ arg1 = arg1.toUpperCase() === 'TRUE' ? '1' : (arg1 === 'FALSE' ? '0' : arg1);
174
+ arg2 = arg2.toUpperCase() === 'TRUE' ? '1' : (arg2 === 'FALSE' ? '0' : arg2);
175
+ var isInvalidNumStr = isNaN(Number(arg1)) || arg1.trim() === '';
176
+ var isInvalidDigStr = isNaN(Number(arg2)) || arg2.trim() === '';
177
+ if (((args[0].indexOf('"') > -1 || this.parent.isCellReference(args[0])) && isInvalidNumStr)
178
+ || ((args[1].indexOf('"') > -1 || this.parent.isCellReference(args[1])) && isInvalidDigStr)) {
179
+ return this.parent.getErrorStrings()[CommonErrors.Value];
180
+ }
181
+ var digits = Math.ceil(this.parent.parseFloat(arg2));
182
+ num = this.parent.parseFloat(arg1);
183
+ if (digits > 0) {
184
+ var decimalArr = arg1.split('.');
185
+ var decimalCount = decimalArr.length === 2 ? (decimalArr[1].length >= digits ? digits : decimalArr[1].length) : 0;
186
+ num = this.parent.parseFloat(this.preciseRound(num, decimalCount, 'ROUNDUP'));
187
+ str = num.toString();
188
+ if (isNaN(num)) {
189
+ if (digits.toString().indexOf('"') > -1) {
190
+ str = this.parent.getErrorStrings()[CommonErrors.Value];
191
+ }
192
+ else {
193
+ str = this.parent.getErrorStrings()[CommonErrors.Name];
194
+ }
195
+ }
196
+ }
197
+ else {
198
+ if (num > 0) {
199
+ num = (num / Math.pow(10, -digits)) + .49999;
200
+ }
201
+ else if (num < 0) {
202
+ num = (num / Math.pow(10, -digits)) - .49999;
203
+ }
204
+ if (num > 0 && digits < -9) {
205
+ num = 1 * Math.pow(10, -digits);
206
+ }
207
+ else {
208
+ num = this.parent.parseFloat(num.toFixed(0)) * Math.pow(10, -digits);
209
+ }
210
+ str = num.toString();
211
+ if (isNaN(num)) {
212
+ str = (digits.toString().indexOf('"') > -1) ? this.parent.getErrorStrings()[CommonErrors.Value] :
213
+ str = this.parent.getErrorStrings()[CommonErrors.Name];
214
+ }
215
+ }
216
+ return str;
217
+ };
218
+ /**
219
+ * Rounds a number down, toward zero.
220
+ *
221
+ * Excel: `ROUNDDOWN(...)`.
222
+ *
223
+ * @hidden
224
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
225
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
226
+ */
227
+ MathRoundingFormulas.prototype.ComputeROUNDDOWN = function () {
228
+ var args = [];
229
+ for (var _i = 0; _i < arguments.length; _i++) {
230
+ args[_i] = arguments[_i];
231
+ }
232
+ var result;
233
+ var arg1;
234
+ var arg2;
235
+ var num;
236
+ var len = args.length;
237
+ if (len === 1 && args[0] === '') {
238
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
239
+ }
240
+ else if (len !== 2) {
241
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
242
+ }
243
+ if (this.parent.isCellReference(args[0])) {
244
+ arg1 = this.parent.getValueFromArg(args[0]) || '0';
245
+ }
246
+ else {
247
+ if (args[0].indexOf(this.parent.tic) > -1 && (args[0].split(this.parent.tic).join('') === this.parent.trueValue ||
248
+ args[0].split(this.parent.tic).join('') === this.parent.falseValue)) {
249
+ return this.parent.getErrorStrings()[CommonErrors.Value];
250
+ }
251
+ arg1 = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
252
+ }
253
+ if (this.parent.getErrorStrings().indexOf(arg1) > -1) {
254
+ return arg1;
255
+ }
256
+ if (this.parent.isCellReference(args[1])) {
257
+ arg2 = this.parent.getValueFromArg(args[1]) || '0';
258
+ }
259
+ else {
260
+ if (args[1].indexOf(this.parent.tic) > -1 && (args[1].split(this.parent.tic).join('') === this.parent.trueValue ||
261
+ args[1].split(this.parent.tic).join('') === this.parent.falseValue)) {
262
+ return this.parent.getErrorStrings()[CommonErrors.Value];
263
+ }
264
+ arg2 = this.parent.getValueFromArg(args[1]).split(this.parent.tic).join('');
265
+ }
266
+ if (this.parent.getErrorStrings().indexOf(arg2) > -1) {
267
+ return arg2;
268
+ }
269
+ arg1 = arg1.toUpperCase() === 'TRUE' ? '1' : (arg1 === 'FALSE' ? '0' : arg1);
270
+ arg2 = arg2.toUpperCase() === 'TRUE' ? '1' : (arg2 === 'FALSE' ? '0' : arg2);
271
+ var isInvalidNumStr = isNaN(Number(arg1)) || arg1.trim() === '';
272
+ var isInvalidDigStr = isNaN(Number(arg2)) || arg2.trim() === '';
273
+ if (((args[0].indexOf('"') > -1 || this.parent.isCellReference(args[0])) && isInvalidNumStr)
274
+ || ((args[1].indexOf('"') > -1 || this.parent.isCellReference(args[1])) && isInvalidDigStr)) {
275
+ return this.parent.getErrorStrings()[CommonErrors.Value];
276
+ }
277
+ var digits = Math.ceil(this.parent.parseFloat(arg2));
278
+ num = this.parent.parseFloat(arg1);
279
+ if (digits > 0) {
280
+ var decimalIndex = arg1.indexOf('.');
281
+ var decimalCount = 0;
282
+ if (decimalIndex !== -1) {
283
+ decimalCount = arg1.length - decimalIndex - 1;
284
+ decimalCount = decimalCount >= digits ? digits : decimalCount;
285
+ }
286
+ num = this.parent.parseFloat(this.preciseRound(num, decimalCount, 'ROUNDDOWN'));
287
+ result = num.toString();
288
+ if (isNaN(num)) {
289
+ if (digits.toString().indexOf('"') > -1) {
290
+ result = this.parent.getErrorStrings()[CommonErrors.Value];
291
+ }
292
+ else {
293
+ result = this.parent.getErrorStrings()[CommonErrors.Name];
294
+ }
295
+ }
296
+ }
297
+ else {
298
+ if (num > 0) {
299
+ num = (num / Math.pow(10, -digits)) - .49999;
300
+ }
301
+ else if (num < 0) {
302
+ num = (num / Math.pow(10, -digits)) + .49999;
303
+ }
304
+ if (num > 0 && digits < -9) {
305
+ num = 1 * Math.pow(10, -digits);
306
+ }
307
+ else {
308
+ num = this.parent.parseFloat(num.toFixed(0)) * Math.pow(10, -digits);
309
+ }
310
+ result = num.toString();
311
+ if (isNaN(num)) {
312
+ result = (digits.toString().indexOf('"') > -1) ? this.parent.getErrorStrings()[CommonErrors.Value] :
313
+ result = this.parent.getErrorStrings()[CommonErrors.Name];
314
+ }
315
+ }
316
+ return result;
317
+ };
318
+ /**
319
+ * Returns the round a number down to the nearest integer.
320
+ *
321
+ * Excel: `FLOOR(...)`.
322
+ *
323
+ * @hidden
324
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
325
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
326
+ */
327
+ MathRoundingFormulas.prototype.ComputeFLOOR = function () {
328
+ var args = [];
329
+ for (var _i = 0; _i < arguments.length; _i++) {
330
+ args[_i] = arguments[_i];
331
+ }
332
+ if (isNullOrUndefined(args) || (args.length === 1 && args[0] === '')) {
333
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
334
+ }
335
+ var argArr = args;
336
+ var argCount = argArr.length;
337
+ var value;
338
+ if (argCount !== 2) {
339
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
340
+ }
341
+ if ((argArr[0] === '' && argArr[1] === '') || (argArr[0] === '' && !argArr[1].includes('"'))) {
342
+ return 0;
343
+ }
344
+ else if (argArr[1] === '' && !argArr[0].includes('"')) {
345
+ argArr[1] = '0';
346
+ }
347
+ for (var i = 0; i < argArr.length; i++) {
348
+ var argVal = argArr[i].split(this.parent.tic).join('').trim();
349
+ if (argVal === '' || (argArr[i].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(argVal)))) {
350
+ return this.parent.getErrorStrings()[CommonErrors.Value];
351
+ }
352
+ if (isCellReference(argArr[i])) {
353
+ value = this.parent.getValueFromArg(argArr[i]) || '0';
354
+ value = (value === this.parent.trueValue) ? '1' : (value === this.parent.falseValue) ? '0' : value;
355
+ if (value.toUpperCase().match(/[A-Z]/) || value.includes('"') || !this.parent.isNumber(value)) {
356
+ return this.parent.getErrorStrings()[CommonErrors.Value];
357
+ }
358
+ }
359
+ else {
360
+ value = this.parent.getValueFromArg(argArr[i].split(this.parent.tic).join(''));
361
+ value = value === this.parent.trueValue ? '1' : (value === this.parent.falseValue ? '0' : value);
362
+ if (value.toUpperCase().match(/[A-Z]/) || value.includes('"') || !this.parent.isNumber(value)) {
363
+ return this.parent.getErrorStrings()[CommonErrors.Value];
364
+ }
365
+ }
366
+ argArr[i] = value;
367
+ }
368
+ var fnum = this.parent.parseFloat(argArr[0]);
369
+ var significance = this.parent.parseFloat(argArr[1]);
370
+ if (fnum > 0 && significance < 0) {
371
+ return this.parent.getErrorStrings()[CommonErrors.Num];
372
+ }
373
+ if ((fnum > 0 || fnum < 0) && significance === 0) {
374
+ return this.parent.getErrorStrings()[CommonErrors.DivZero];
375
+ }
376
+ if (isNaN(fnum)) {
377
+ return this.parent.getErrorStrings()[CommonErrors.Name];
378
+ }
379
+ if (fnum === 0 && significance === 0) {
380
+ return 0;
381
+ }
382
+ return Math.floor(fnum / significance) * significance;
383
+ };
384
+ /**
385
+ * Returns a number rounded up to a multiple of another number.
386
+ *
387
+ * Excel: `CEILING(...)`.
388
+ *
389
+ * @hidden
390
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
391
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
392
+ */
393
+ MathRoundingFormulas.prototype.ComputeCEILING = function () {
394
+ var args = [];
395
+ for (var _i = 0; _i < arguments.length; _i++) {
396
+ args[_i] = arguments[_i];
397
+ }
398
+ if (isNullOrUndefined(args) || (args.length === 1 && args[0] === '')) {
399
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
400
+ }
401
+ var argArr = args;
402
+ var argCount = argArr.length;
403
+ var value;
404
+ if (argCount !== 2) {
405
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
406
+ }
407
+ if ((argArr[0] === '' && argArr[1] === '') || (argArr[0] === '' && !argArr[1].includes('"'))) {
408
+ return 0;
409
+ }
410
+ else if (argArr[1] === '' && !argArr[0].includes('"')) {
411
+ argArr[1] = '0';
412
+ }
413
+ for (var i = 0; i < argArr.length; i++) {
414
+ var argVal = argArr[i].split(this.parent.tic).join('').trim();
415
+ if (argVal === '' || (argArr[i].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(argVal)))) {
416
+ return this.parent.getErrorStrings()[CommonErrors.Value];
417
+ }
418
+ if (isCellReference(argArr[i])) {
419
+ value = this.parent.getValueFromArg(argArr[i]) || '0';
420
+ value = (value === this.parent.trueValue) ? '1' : (value === this.parent.falseValue) ? '0' : value;
421
+ if (value.toUpperCase().match(/[A-Z]/) || value.includes('"') || !this.parent.isNumber(value)) {
422
+ return this.parent.getErrorStrings()[CommonErrors.Value];
423
+ }
424
+ }
425
+ else {
426
+ value = this.parent.getValueFromArg(argArr[i].split(this.parent.tic).join(''));
427
+ value = (value === this.parent.trueValue) ? '1' : (value === this.parent.falseValue) ? '0' : value;
428
+ if (value.toUpperCase().match(/[A-Z]/) || value.includes('"') || !this.parent.isNumber(value)) {
429
+ return this.parent.getErrorStrings()[CommonErrors.Value];
430
+ }
431
+ }
432
+ argArr[i] = value;
433
+ }
434
+ var cnum = this.parent.parseFloat(argArr[0]);
435
+ var significance = this.parent.parseFloat(argArr[1]);
436
+ if (cnum > 0 && significance < 0) {
437
+ return this.parent.getErrorStrings()[CommonErrors.Num];
438
+ }
439
+ if (isNaN(cnum)) {
440
+ return this.parent.getErrorStrings()[CommonErrors.Name];
441
+ }
442
+ if ((cnum > 0 || cnum === 0) && significance === 0) {
443
+ return 0;
444
+ }
445
+ return Math.ceil(cnum / significance) * significance;
446
+ };
447
+ /**
448
+ * Returns a number to the nearest integer.
449
+ *
450
+ * Excel: `INT(...)`.
451
+ *
452
+ * @hidden
453
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
454
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
455
+ */
456
+ MathRoundingFormulas.prototype.ComputeINT = function () {
457
+ var args = [];
458
+ for (var _i = 0; _i < arguments.length; _i++) {
459
+ args[_i] = arguments[_i];
460
+ }
461
+ var argsValue;
462
+ var errCollection = this.parent.getErrorStrings();
463
+ if (args[0] === '' && args.length === 1) {
464
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
465
+ }
466
+ else if (args.length > 1) {
467
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
468
+ }
469
+ argsValue = this.parent.getValueFromArg(args[0]);
470
+ if (errCollection.indexOf(argsValue) > -1) {
471
+ return argsValue;
472
+ }
473
+ if (argsValue.toUpperCase() === this.parent.trueValue) {
474
+ argsValue = '1';
475
+ }
476
+ else if (argsValue.toUpperCase() === this.parent.falseValue) {
477
+ argsValue = '0';
478
+ }
479
+ if (!this.parent.isCellReference(args[0])) {
480
+ if (args[0].indexOf(this.parent.tic + this.parent.tic) === -1) {
481
+ argsValue = argsValue.split(this.parent.tic).join('');
482
+ }
483
+ if (argsValue.trim() === '') {
484
+ return errCollection[CommonErrors.Value];
485
+ }
486
+ }
487
+ if (argsValue.indexOf('%') > -1) {
488
+ argsValue = (Number(argsValue.split('%')[0]) * 0.01).toString();
489
+ }
490
+ if (isNaN(this.parent.parseFloat(argsValue))) {
491
+ return errCollection[CommonErrors.Value];
492
+ }
493
+ argsValue = this.parent.parseFloat(argsValue);
494
+ argsValue = Math.floor(argsValue);
495
+ return argsValue;
496
+ };
497
+ /**
498
+ * Returns the truncated value of a number to a specified number of decimal places.
499
+ *
500
+ * Excel: `TRUNC(...)`.
501
+ *
502
+ * @hidden
503
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
504
+ * @returns {boolean} - Boolean result, nested-formula numeric string (`"0"`/`"1"`), or an Excel error token.
505
+ */
506
+ MathRoundingFormulas.prototype.ComputeTRUNC = function () {
507
+ var _this = this;
508
+ var args = [];
509
+ for (var _i = 0; _i < arguments.length; _i++) {
510
+ args[_i] = arguments[_i];
511
+ }
512
+ var orgNumValue;
513
+ var orgDigitValue = 0;
514
+ var errCollection = this.parent.getErrorStrings();
515
+ if (isNullOrUndefined(args) || (args[0] === '' && args.length === 1)) {
516
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
517
+ }
518
+ else if (args.length === 0 || args.length > 2) {
519
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
520
+ }
521
+ var processArgs = function (orgValue) {
522
+ var actualValue = _this.parent.getValueFromArg(orgValue);
523
+ if (errCollection.indexOf(actualValue) > -1) {
524
+ return actualValue;
525
+ }
526
+ if (actualValue === _this.parent.trueValue) {
527
+ actualValue = '1';
528
+ }
529
+ else if (actualValue === _this.parent.falseValue) {
530
+ actualValue = '0';
531
+ }
532
+ else if (!_this.parent.isCellReference(orgValue)) {
533
+ if (orgValue.indexOf(_this.parent.tic) > -1 && _this.parent.removeTics(orgValue).match(/^(\d*\.\d+|\d+)\s*[*]\s*(\d*\.\d+|\d+)$/)) {
534
+ actualValue = _this.parent.getValueFromArg(_this.parent.removeTics(orgValue));
535
+ }
536
+ else if (actualValue.indexOf(_this.parent.tic) > -1) {
537
+ actualValue = _this.parent.removeTics(actualValue);
538
+ if (actualValue.trim() === '') {
539
+ return errCollection[CommonErrors.Value];
540
+ }
541
+ else if (actualValue.indexOf(':') > -1) {
542
+ var values = actualValue.split(':');
543
+ if (values.length <= 3) {
544
+ if (!_this.parent.isNumber(values[0]) || !_this.parent.isNumber(values[1])) {
545
+ return errCollection[CommonErrors.Value];
546
+ }
547
+ var hours = Number(values[0]) + Number((Number(values[1]) / 60));
548
+ if (values.length === 3) {
549
+ if (!_this.parent.isNumber(values[2])) {
550
+ return errCollection[CommonErrors.Value];
551
+ }
552
+ hours += Number(Number(values[2]) / 3600);
553
+ }
554
+ actualValue = (hours / 24).toString();
555
+ }
556
+ else {
557
+ return errCollection[CommonErrors.Value];
558
+ }
559
+ }
560
+ }
561
+ if (actualValue.split('%').length === 2 && _this.parent.isNumber(actualValue.split('%')[0])) {
562
+ actualValue = (Number(actualValue.split('%')[0]) * 0.01).toString();
563
+ }
564
+ }
565
+ return actualValue;
566
+ };
567
+ if (!isNullOrUndefined(args[0])) {
568
+ orgNumValue = processArgs(args[0]);
569
+ if (errCollection.indexOf(orgNumValue) > -1) {
570
+ return orgNumValue;
571
+ }
572
+ orgNumValue = this.parent.parseFloat(orgNumValue);
573
+ if (isNaN(orgNumValue)) {
574
+ return errCollection[CommonErrors.Value];
575
+ }
576
+ }
577
+ if (!isNullOrUndefined(args[1])) {
578
+ orgDigitValue = processArgs(args[1]);
579
+ if (errCollection.indexOf(orgDigitValue) > -1) {
580
+ return orgDigitValue;
581
+ }
582
+ orgDigitValue = this.parent.parseFloat(orgDigitValue);
583
+ if (isNaN(orgDigitValue)) {
584
+ return errCollection[CommonErrors.Value];
585
+ }
586
+ }
587
+ orgDigitValue = Math.pow(10, Math.floor(orgDigitValue));
588
+ orgNumValue = Number(orgNumValue);
589
+ return ((orgNumValue < 0 ? -1 : 1) * Math.floor(orgDigitValue * Math.abs(orgNumValue)) / orgDigitValue).toString();
590
+ };
591
+ /**
592
+ * Rounds a positive number up and negative number down to the nearest odd integer.
593
+ *
594
+ * Excel: `ODD(...)`.
595
+ *
596
+ * @hidden
597
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
598
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
599
+ */
600
+ MathRoundingFormulas.prototype.ComputeODD = function () {
601
+ var args = [];
602
+ for (var _i = 0; _i < arguments.length; _i++) {
603
+ args[_i] = arguments[_i];
604
+ }
605
+ if (isNullOrUndefined(args) || args.length !== 1 || args[0] === '') {
606
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
607
+ }
608
+ var argVal = args[0].split(this.parent.tic).join('').trim();
609
+ if (argVal === '' || (args[0].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(argVal)))) {
610
+ return this.parent.getErrorStrings()[CommonErrors.Value];
611
+ }
612
+ var val;
613
+ if (isCellReference(args[0])) {
614
+ val = this.parent.getValueFromArg(args[0]);
615
+ if (this.parent.getErrorStrings().indexOf(val) > -1) {
616
+ return val;
617
+ }
618
+ if (val === this.parent.trueValue) {
619
+ val = '1';
620
+ }
621
+ else if (val === '' || val === this.parent.falseValue) {
622
+ val = '0';
623
+ }
624
+ else if (val.toUpperCase().match(/[A-Z]/) || val.includes('"') || !this.parent.isNumber(val)) {
625
+ return this.parent.getErrorStrings()[CommonErrors.Value];
626
+ }
627
+ }
628
+ else {
629
+ val = this.parent.getValueFromArg(args[0].split(this.parent.tic).join(''));
630
+ if (val === '#NAME?') {
631
+ return this.parent.getErrorStrings()[CommonErrors.Name];
632
+ }
633
+ if (val === this.parent.trueValue) {
634
+ val = '1';
635
+ }
636
+ else if (val === '' || val === this.parent.falseValue) {
637
+ val = '0';
638
+ }
639
+ else if (val.toUpperCase().match(/[A-Z]/) || !this.parent.isNumber(val)) {
640
+ return this.parent.getErrorStrings()[CommonErrors.Value];
641
+ }
642
+ }
643
+ var result = Math.ceil(parseInt(val, 10));
644
+ var isOne = result === 0;
645
+ result = result % 2 === 0 ? (result > 0 ? result + 1 : result - 1) : result;
646
+ if (Math.ceil(parseInt(val, 10)) % 2 !== 0) {
647
+ if (parseInt(val, 10) > 0 && parseFloat(val) > parseInt(val, 10)) {
648
+ result = result + 2;
649
+ }
650
+ else if (parseInt(val, 10) < 0 && parseFloat(val) < parseInt(val, 10)) {
651
+ result = result - 2;
652
+ }
653
+ }
654
+ if (isNaN(result)) {
655
+ return this.parent.getErrorStrings()[CommonErrors.Name];
656
+ }
657
+ return isOne ? 1 : result;
658
+ };
659
+ /**
660
+ * Rounds a positive number up and negative number down to the nearest even integer.
661
+ *
662
+ * Excel: `EVEN(...)`.
663
+ *
664
+ * @hidden
665
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
666
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
667
+ */
668
+ MathRoundingFormulas.prototype.ComputeEVEN = function () {
669
+ var args = [];
670
+ for (var _i = 0; _i < arguments.length; _i++) {
671
+ args[_i] = arguments[_i];
672
+ }
673
+ if (isNullOrUndefined(args) || args.length !== 1 || args[0] === '') {
674
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
675
+ }
676
+ var argVal = args[0].split(this.parent.tic).join('').trim();
677
+ if (argVal === '' || (args[0].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(argVal)))) {
678
+ return this.parent.getErrorStrings()[CommonErrors.Value];
679
+ }
680
+ var value1;
681
+ if (isCellReference(args[0])) {
682
+ value1 = this.parent.getValueFromArg(args[0]);
683
+ if (this.parent.getErrorStrings().indexOf(value1) > -1) {
684
+ return value1;
685
+ }
686
+ if (value1 === this.parent.trueValue) {
687
+ value1 = '1';
688
+ }
689
+ else if (value1 === '' || value1 === this.parent.falseValue) {
690
+ value1 = '0';
691
+ }
692
+ else if (value1.toUpperCase().match(/[A-Z]/) || value1.includes('"') || !this.parent.isNumber(value1)) {
693
+ return this.parent.getErrorStrings()[CommonErrors.Value];
694
+ }
695
+ }
696
+ else {
697
+ value1 = this.parent.getValueFromArg(args[0].split(this.parent.tic).join(''));
698
+ if (value1 === '#NAME?') {
699
+ return this.parent.getErrorStrings()[CommonErrors.Name];
700
+ }
701
+ if (value1 === this.parent.trueValue) {
702
+ value1 = '1';
703
+ }
704
+ else if (value1 === '' || value1 === this.parent.falseValue) {
705
+ value1 = '0';
706
+ }
707
+ else if (value1.toUpperCase().match(/[A-Z]/) || !this.parent.isNumber(value1)) {
708
+ return this.parent.getErrorStrings()[CommonErrors.Value];
709
+ }
710
+ }
711
+ var result = Math.ceil(parseInt(value1, 10));
712
+ result = result % 2 === 0 ? result : (result > 0 ? result + 1 : result - 1);
713
+ if (Math.ceil(parseInt(value1, 10)) % 2 === 0) {
714
+ if (parseInt(value1, 10) > 0 && parseFloat(value1) > parseInt(value1, 10)) {
715
+ result = result + 2;
716
+ }
717
+ else if (parseInt(value1, 10) < 0 && parseFloat(value1) < parseInt(value1, 10)) {
718
+ result = result - 2;
719
+ }
720
+ }
721
+ if (isNaN(result)) {
722
+ return this.parent.getErrorStrings()[CommonErrors.Name];
723
+ }
724
+ return result;
725
+ };
726
+ return MathRoundingFormulas;
727
+ }(FormulaModuleBase));
728
+ export { MathRoundingFormulas };