Functions::getFinancialFunctions()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 21
rs 9.3142
cc 1
eloc 17
nc 1
nop 0
1
<?php
2
3
namespace Xls;
4
5
class Functions
6
{
7
    /**
8
     * @var null|array
9
     */
10
    protected static $functions = null;
11
12
    /**
13
     * @param $function
14
     *
15
     * @return mixed
16
     * @throws \Exception
17
     */
18
    public static function getFunction($function)
19
    {
20
        if (is_null(self::$functions)) {
21
            self::$functions = self::getBuiltIn();
22
        }
23
24
        if (isset(self::$functions[$function])) {
25
            return self::$functions[$function];
26
        }
27
28
        throw new \Exception("Function $function() doesn't exist");
29
    }
30
31
    /**
32
     * @param $function
33
     *
34
     * @return mixed
35
     * @throws \Exception
36
     */
37
    public static function getArgsNumber($function)
38
    {
39
        $function = self::getFunction($function);
40
41
        return $function[1];
42
    }
43
44
    /**
45
     * @param $function
46
     *
47
     * @return mixed
48
     */
49
    public static function getPtg($function)
50
    {
51
        $function = self::getFunction($function);
52
53
        return $function[0];
54
    }
55
56
    /**
57
     * The array elements are as follow:
58
     *  ptg:   The Excel function ptg code.
59
     *  args:  The number of arguments that the function takes:
60
     *           >=0 is a fixed number of arguments.
61
     *           -1  is a variable  number of arguments.
62
     *  class: The reference, value or array class of the function args.
63
     *  vol:   The function is volatile.
64
     * @return array
65
     */
66
    public static function getBuiltIn()
67
    {
68
        return array_merge(
69
            self::getBasicFunctions(),
70
            self::getTrigonometricFunctions(),
71
            self::getDatetimeFunctions(),
72
            self::getMathFunctions(),
73
            self::getTextFunctions(),
74
            self::getLogicalFunctions(),
75
            self::getInformationFunctions(),
76
            self::getLookupFunctions(),
77
            self::getStatisticalFunctions(),
78
            self::getDistributionFunctions(),
79
            self::getDatabaseFunctions(),
80
            self::getFinancialFunctions()
81
        );
82
    }
83
84
    /**
85
     * @return array
86
     */
87
    protected static function getBasicFunctions()
88
    {
89
        return array(
90
            // function ptg  args  class  vol
91
            'CALL' => array(150, -1, 1, 0),
92
            'REGISTER.ID' => array(267, -1, 1, 0),
93
        );
94
    }
95
96
    /**
97
     * @return array
98
     */
99
    protected static function getTrigonometricFunctions()
100
    {
101
        return array(
102
            // function ptg  args  class  vol
103
            'SIN' => array(15, 1, 1, 0),
104
            'COS' => array(16, 1, 1, 0),
105
            'TAN' => array(17, 1, 1, 0),
106
            'ATAN' => array(18, 1, 1, 0),
107
            'ATAN2' => array(97, 2, 1, 0),
108
            'ASIN' => array(98, 1, 1, 0),
109
            'ACOS' => array(99, 1, 1, 0),
110
            'RADIANS' => array(342, 1, 1, 0),
111
            'DEGREES' => array(343, 1, 1, 0),
112
            'SINH' => array(229, 1, 1, 0),
113
            'COSH' => array(230, 1, 1, 0),
114
            'TANH' => array(231, 1, 1, 0),
115
            'ASINH' => array(232, 1, 1, 0),
116
            'ACOSH' => array(233, 1, 1, 0),
117
            'ATANH' => array(234, 1, 1, 0),
118
        );
119
    }
120
121
    /**
122
     * @return array
123
     */
124
    protected static function getDatetimeFunctions()
125
    {
126
        return array(
127
            // function ptg  args  class  vol
128
            'DATE' => array(65, 3, 1, 0),
129
            'TIME' => array(66, 3, 1, 0),
130
            'DAY' => array(67, 1, 1, 0),
131
            'MONTH' => array(68, 1, 1, 0),
132
            'YEAR' => array(69, 1, 1, 0),
133
            'WEEKDAY' => array(70, -1, 1, 0),
134
            'HOUR' => array(71, 1, 1, 0),
135
            'MINUTE' => array(72, 1, 1, 0),
136
            'SECOND' => array(73, 1, 1, 0),
137
            'NOW' => array(74, 0, 1, 1),
138
            'DATEVALUE' => array(140, 1, 1, 0),
139
            'TIMEVALUE' => array(141, 1, 1, 0),
140
            'DAYS360' => array(220, -1, 1, 0),
141
            'TODAY' => array(221, 0, 1, 1),
142
        );
143
    }
144
145
    /**
146
     * @return array
147
     */
148
    protected static function getMathFunctions()
149
    {
150
        return array(
151
            // function ptg  args  class  vol
152
            'SUM' => array(4, -1, 0, 0),
153
            'SUMIF' => array(345, -1, 0, 0),
154
            'SUMPRODUCT' => array(228, -1, 2, 0),
155
            'SUMXMY2' => array(303, 2, 2, 0),
156
            'SUMX2MY2' => array(304, 2, 2, 0),
157
            'SUMX2PY2' => array(305, 2, 2, 0),
158
            'SUMSQ' => array(321, -1, 0, 0),
159
            'PI' => array(19, 0, 1, 0),
160
            'SQRT' => array(20, 1, 1, 0),
161
            'EXP' => array(21, 1, 1, 0),
162
            'LN' => array(22, 1, 1, 0),
163
            'LOG' => array(109, -1, 1, 0),
164
            'LOG10' => array(23, 1, 1, 0),
165
            'ABS' => array(24, 1, 1, 0),
166
            'INT' => array(25, 1, 1, 0),
167
            'SIGN' => array(26, 1, 1, 0),
168
            'ROUND' => array(27, 2, 1, 0),
169
            'ROUNDUP' => array(212, 2, 1, 0),
170
            'ROUNDDOWN' => array(213, 2, 1, 0),
171
            'TRUNC' => array(197, -1, 1, 0),
172
            'CEILING' => array(288, 2, 1, 0),
173
            'FLOOR' => array(285, 2, 1, 0),
174
            'SUBTOTAL' => array(344, -1, 0, 0),
175
            'POWER' => array(337, 2, 1, 0),
176
            'MOD' => array(39, 2, 1, 0),
177
            'PRODUCT' => array(183, -1, 0, 0),
178
            'ODD' => array(298, 1, 1, 0),
179
            'EVEN' => array(279, 1, 1, 0),
180
            'FACT' => array(184, 1, 1, 0),
181
            'ROMAN' => array(354, -1, 1, 0),
182
            'COMBIN' => array(276, 2, 1, 0),
183
            'RAND' => array(63, 0, 1, 1),
184
            'MDETERM' => array(163, 1, 2, 0),
185
            'MINVERSE' => array(164, 1, 2, 0),
186
            'MMULT' => array(165, 2, 2, 0),
187
        );
188
    }
189
190
    /**
191
     * @return array
192
     */
193
    protected static function getTextFunctions()
194
    {
195
        return array(
196
            // function ptg  args  class  vol
197
            'CHAR' => array(111, 1, 1, 0),
198
            'LOWER' => array(112, 1, 1, 0),
199
            'UPPER' => array(113, 1, 1, 0),
200
            'PROPER' => array(114, 1, 1, 0),
201
            'LEFT' => array(115, -1, 1, 0),
202
            'RIGHT' => array(116, -1, 1, 0),
203
            'EXACT' => array(117, 2, 1, 0),
204
            'TRIM' => array(118, 1, 1, 0),
205
            'REPLACE' => array(119, 4, 1, 0),
206
            'SUBSTITUTE' => array(120, -1, 1, 0),
207
            'CLEAN' => array(162, 1, 1, 0),
208
            'REPT' => array(30, 2, 1, 0),
209
            'MID' => array(31, 3, 1, 0),
210
            'CONCATENATE' => array(336, -1, 1, 0),
211
            'FIND' => array(124, -1, 1, 0),
212
            'T' => array(130, 1, 0, 0),
213
            'LEN' => array(32, 1, 1, 0),
214
            'SEARCH' => array(82, -1, 1, 0),
215
            'CODE' => array(121, 1, 1, 0),
216
            'DOLLAR' => array(13, -1, 1, 0),
217
            'FIXED' => array(14, -1, 1, 0),
218
            'TEXT' => array(48, 2, 1, 0),
219
            'VALUE' => array(33, 1, 1, 0),
220
        );
221
    }
222
223
    /**
224
     * @return array
225
     */
226
    protected static function getLogicalFunctions()
227
    {
228
        return array(
229
            // function ptg  args  class  vol
230
            'TRUE' => array(34, 0, 1, 0),
231
            'FALSE' => array(35, 0, 1, 0),
232
            'AND' => array(36, -1, 0, 0),
233
            'OR' => array(37, -1, 0, 0),
234
            'NOT' => array(38, 1, 1, 0),
235
            'IF' => array(1, -1, 1, 0),
236
        );
237
    }
238
239
    /**
240
     * @return array
241
     */
242
    protected static function getInformationFunctions()
243
    {
244
        return array(
245
            // function ptg  args  class  vol
246
            'ISNA' => array(2, 1, 1, 0),
247
            'ISERROR' => array(3, 1, 1, 0),
248
            'ISREF' => array(105, 1, 0, 0),
249
            'ISERR' => array(126, 1, 1, 0),
250
            'ISTEXT' => array(127, 1, 1, 0),
251
            'ISNUMBER' => array(128, 1, 1, 0),
252
            'ISBLANK' => array(129, 1, 1, 0),
253
            'ISNONTEXT' => array(190, 1, 1, 0),
254
            'ISLOGICAL' => array(198, 1, 1, 0),
255
            'CELL' => array(125, -1, 0, 1),
256
            'INFO' => array(244, 1, 1, 1),
257
            'NA' => array(10, 0, 0, 0),
258
            'N' => array(131, 1, 0, 0),
259
            'TYPE' => array(86, 1, 1, 0),
260
            'ERROR.TYPE' => array(261, 1, 1, 0),
261
        );
262
    }
263
264
    /**
265
     * @return array
266
     */
267
    protected static function getLookupFunctions()
268
    {
269
        return array(
270
            // function ptg  args  class  vol
271
            'LOOKUP' => array(28, -1, 0, 0),
272
            'HLOOKUP' => array(101, -1, 0, 0),
273
            'VLOOKUP' => array(102, -1, 0, 0),
274
            'CHOOSE' => array(100, -1, 1, 0),
275
            'MATCH' => array(64, -1, 0, 0),
276
            'AREAS' => array(75, 1, 0, 1),
277
            'ROW' => array(8, -1, 0, 0),
278
            'COLUMN' => array(9, -1, 0, 0),
279
            'ROWS' => array(76, 1, 0, 1),
280
            'COLUMNS' => array(77, 1, 0, 1),
281
            'ADDRESS' => array(219, -1, 1, 0),
282
            'INDEX' => array(29, -1, 0, 1),
283
            'OFFSET' => array(78, -1, 0, 1),
284
            'INDIRECT' => array(148, -1, 1, 1),
285
            'TRANSPOSE' => array(83, 1, 1, 0),
286
        );
287
    }
288
289
    /**
290
     * @return array
291
     */
292
    protected static function getStatisticalFunctions()
293
    {
294
        return array(
295
            // function ptg  args  class  vol
296
            'AVERAGE' => array(5, -1, 0, 0),
297
            'MIN' => array(6, -1, 0, 0),
298
            'MAX' => array(7, -1, 0, 0),
299
            'COUNTA' => array(169, -1, 0, 0),
300
            'COUNT' => array(0, -1, 0, 0),
301
            'COUNTIF' => array(346, 2, 0, 0),
302
            'COUNTBLANK' => array(347, 1, 0, 0),
303
            'STDEVP' => array(193, -1, 0, 0),
304
            'FREQUENCY' => array(252, 2, 0, 0),
305
            'MEDIAN' => array(227, -1, 0, 0),
306
            'MODE' => array(330, -1, 2, 0),
307
            'TRIMMEAN' => array(331, 2, 0, 0),
308
            'QUARTILE' => array(327, 2, 0, 0),
309
            'PERCENTILE' => array(328, 2, 0, 0),
310
            'PERCENTRANK' => array(329, -1, 0, 0),
311
            'RANK' => array(216, -1, 0, 0),
312
            'GEOMEAN' => array(319, -1, 0, 0),
313
            'HARMEAN' => array(320, -1, 0, 0),
314
            'KURT' => array(322, -1, 0, 0),
315
            'STDEV' => array(12, -1, 0, 0),
316
            'AVEDEV' => array(269, -1, 0, 0),
317
            'DEVSQ' => array(318, -1, 0, 0),
318
            'SKEW' => array(323, -1, 0, 0),
319
            'VAR' => array(46, -1, 0, 0),
320
            'VARP' => array(194, -1, 0, 0),
321
            'COVAR' => array(308, 2, 2, 0),
322
            'LARGE' => array(325, 2, 0, 0),
323
            'SMALL' => array(326, 2, 0, 0),
324
            'STEYX' => array(314, 2, 2, 0),
325
            'CORREL' => array(307, 2, 2, 0),
326
            'FORECAST' => array(309, 3, 2, 0),
327
            'SLOPE' => array(315, 2, 2, 0),
328
            'INTERCEPT' => array(311, 2, 2, 0),
329
            'TTEST' => array(316, 4, 2, 0),
330
            'LINEST' => array(49, -1, 0, 0),
331
            'TREND' => array(50, -1, 0, 0),
332
            'GROWTH' => array(52, -1, 0, 0),
333
            'LOGEST' => array(51, -1, 0, 0),
334
            'PERMUT' => array(299, 2, 1, 0),
335
        );
336
    }
337
338
    /**
339
     * @return array
340
     */
341
    protected static function getDistributionFunctions()
342
    {
343
        return array(
344
            // function ptg  args  class  vol
345
            'CONFIDENCE' => array(277, 3, 1, 0),
346
            'CRITBINOM' => array(278, 3, 1, 0),
347
            'EXPONDIST' => array(280, 3, 1, 0),
348
            'FDIST' => array(281, 3, 1, 0),
349
            'FINV' => array(282, 3, 1, 0),
350
            'FISHER' => array(283, 1, 1, 0),
351
            'FISHERINV' => array(284, 1, 1, 0),
352
            'GAMMADIST' => array(286, 4, 1, 0),
353
            'GAMMAINV' => array(287, 3, 1, 0),
354
            'HYPGEOMDIST' => array(289, 4, 1, 0),
355
            'LOGNORMDIST' => array(290, 3, 1, 0),
356
            'LOGINV' => array(291, 3, 1, 0),
357
            'NEGBINOMDIST' => array(292, 3, 1, 0),
358
            'NORMDIST' => array(293, 4, 1, 0),
359
            'NORMSDIST' => array(294, 1, 1, 0),
360
            'NORMINV' => array(295, 3, 1, 0),
361
            'NORMSINV' => array(296, 1, 1, 0),
362
            'BETADIST' => array(270, -1, 1, 0),
363
            'GAMMALN' => array(271, 1, 1, 0),
364
            'BETAINV' => array(272, -1, 1, 0),
365
            'BINOMDIST' => array(273, 4, 1, 0),
366
            'CHIDIST' => array(274, 2, 1, 0),
367
            'CHIINV' => array(275, 2, 1, 0),
368
            'STANDARDIZE' => array(297, 3, 1, 0),
369
            'POISSON' => array(300, 3, 1, 0),
370
            'TDIST' => array(301, 3, 1, 0),
371
            'WEIBULL' => array(302, 4, 1, 0),
372
            'CHITEST' => array(306, 2, 2, 0),
373
            'FTEST' => array(310, 2, 2, 0),
374
            'PEARSON' => array(312, 2, 2, 0),
375
            'RSQ' => array(313, 2, 2, 0),
376
            'PROB' => array(317, -1, 2, 0),
377
            'ZTEST' => array(324, -1, 0, 0),
378
            'TINV' => array(332, 2, 1, 0),
379
        );
380
    }
381
382
    /**
383
     * @return array
384
     */
385
    protected static function getDatabaseFunctions()
386
    {
387
        return array(
388
            // function ptg  args  class  vol
389
            'DCOUNT' => array(40, 3, 0, 0),
390
            'DSUM' => array(41, 3, 0, 0),
391
            'DAVERAGE' => array(42, 3, 0, 0),
392
            'DMIN' => array(43, 3, 0, 0),
393
            'DMAX' => array(44, 3, 0, 0),
394
            'DSTDEV' => array(45, 3, 0, 0),
395
            'DVAR' => array(47, 3, 0, 0),
396
            'DPRODUCT' => array(189, 3, 0, 0),
397
            'DSTDEVP' => array(195, 3, 0, 0),
398
            'DVARP' => array(196, 3, 0, 0),
399
            'DCOUNTA' => array(199, 3, 0, 0),
400
            'DGET' => array(235, 3, 0, 0),
401
        );
402
    }
403
404
    /**
405
     * @return array
406
     */
407
    protected static function getFinancialFunctions()
408
    {
409
        return array(
410
            // function ptg  args  class  vol
411
            'NPV' => array(11, -1, 1, 0),
412
            'PV' => array(56, -1, 1, 0),
413
            'FV' => array(57, -1, 1, 0),
414
            'MIRR' => array(61, 3, 0, 0),
415
            'IRR' => array(62, -1, 0, 0),
416
            'PMT' => array(59, -1, 1, 0),
417
            'IPMT' => array(167, -1, 1, 0),
418
            'PPMT' => array(168, -1, 1, 0),
419
            'DDB' => array(144, -1, 1, 0),
420
            'VDB' => array(222, -1, 1, 0),
421
            'DB' => array(247, -1, 1, 0),
422
            'SLN' => array(142, 3, 1, 0),
423
            'SYD' => array(143, 4, 1, 0),
424
            'RATE' => array(60, -1, 1, 0),
425
            'NPER' => array(58, -1, 1, 0),
426
        );
427
    }
428
}
429