Skip to content

Commit 5ad1675

Browse files
author
MarkBaker
committed
Start work on breaking down some of the Financial Excel functions
1 parent 4e8a926 commit 5ad1675

File tree

3 files changed

+92
-36
lines changed

3 files changed

+92
-36
lines changed

src/PhpSpreadsheet/Calculation/Calculation.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -875,12 +875,12 @@ class Calculation
875875
],
876876
'DOLLARDE' => [
877877
'category' => Category::CATEGORY_FINANCIAL,
878-
'functionCall' => [Financial::class, 'DOLLARDE'],
878+
'functionCall' => [Financial\Dollar::class, 'decimal'],
879879
'argumentCount' => '2',
880880
],
881881
'DOLLARFR' => [
882882
'category' => Category::CATEGORY_FINANCIAL,
883-
'functionCall' => [Financial::class, 'DOLLARFR'],
883+
'functionCall' => [Financial\Dollar::class, 'fractional'],
884884
'argumentCount' => '2',
885885
],
886886
'DPRODUCT' => [

src/PhpSpreadsheet/Calculation/Financial.php

+10-34
Original file line numberDiff line numberDiff line change
@@ -997,30 +997,18 @@ public static function DISC($settlement, $maturity, $price, $redemption, $basis
997997
* Excel Function:
998998
* DOLLARDE(fractional_dollar,fraction)
999999
*
1000+
* @Deprecated 1.18.0
1001+
*
1002+
* @see Use the decimal() method in the Financial\Dollar class instead
1003+
*
10001004
* @param float $fractional_dollar Fractional Dollar
10011005
* @param int $fraction Fraction
10021006
*
10031007
* @return float|string
10041008
*/
10051009
public static function DOLLARDE($fractional_dollar = null, $fraction = 0)
10061010
{
1007-
$fractional_dollar = Functions::flattenSingleValue($fractional_dollar);
1008-
$fraction = (int) Functions::flattenSingleValue($fraction);
1009-
1010-
// Validate parameters
1011-
if ($fractional_dollar === null || $fraction < 0) {
1012-
return Functions::NAN();
1013-
}
1014-
if ($fraction == 0) {
1015-
return Functions::DIV0();
1016-
}
1017-
1018-
$dollars = floor($fractional_dollar);
1019-
$cents = fmod($fractional_dollar, 1);
1020-
$cents /= $fraction;
1021-
$cents *= 10 ** ceil(log10($fraction));
1022-
1023-
return $dollars + $cents;
1011+
return Financial\Dollar::decimal($fractional_dollar, $fraction);
10241012
}
10251013

10261014
/**
@@ -1033,30 +1021,18 @@ public static function DOLLARDE($fractional_dollar = null, $fraction = 0)
10331021
* Excel Function:
10341022
* DOLLARFR(decimal_dollar,fraction)
10351023
*
1024+
* @Deprecated 1.18.0
1025+
*
1026+
* @see Use the fractional() method in the Financial\Dollar class instead
1027+
*
10361028
* @param float $decimal_dollar Decimal Dollar
10371029
* @param int $fraction Fraction
10381030
*
10391031
* @return float|string
10401032
*/
10411033
public static function DOLLARFR($decimal_dollar = null, $fraction = 0)
10421034
{
1043-
$decimal_dollar = Functions::flattenSingleValue($decimal_dollar);
1044-
$fraction = (int) Functions::flattenSingleValue($fraction);
1045-
1046-
// Validate parameters
1047-
if ($decimal_dollar === null || $fraction < 0) {
1048-
return Functions::NAN();
1049-
}
1050-
if ($fraction == 0) {
1051-
return Functions::DIV0();
1052-
}
1053-
1054-
$dollars = floor($decimal_dollar);
1055-
$cents = fmod($decimal_dollar, 1);
1056-
$cents *= $fraction;
1057-
$cents *= 10 ** (-ceil(log10($fraction)));
1058-
1059-
return $dollars + $cents;
1035+
return Financial\Dollar::fractional($decimal_dollar, $fraction);
10601036
}
10611037

10621038
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheet\Calculation\Financial;
4+
5+
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
6+
7+
class Dollar
8+
{
9+
/**
10+
* DOLLARDE.
11+
*
12+
* Converts a dollar price expressed as an integer part and a fraction
13+
* part into a dollar price expressed as a decimal number.
14+
* Fractional dollar numbers are sometimes used for security prices.
15+
*
16+
* Excel Function:
17+
* DOLLARDE(fractional_dollar,fraction)
18+
*
19+
* @param float $fractionalDollar Fractional Dollar
20+
* @param int $fraction Fraction
21+
*
22+
* @return float|string
23+
*/
24+
public static function decimal($fractionalDollar = null, $fraction = 0)
25+
{
26+
$fractionalDollar = Functions::flattenSingleValue($fractionalDollar);
27+
$fraction = (int) Functions::flattenSingleValue($fraction);
28+
29+
// Validate parameters
30+
if ($fractionalDollar === null || $fraction < 0) {
31+
return Functions::NAN();
32+
}
33+
if ($fraction == 0) {
34+
return Functions::DIV0();
35+
}
36+
37+
$dollars = floor($fractionalDollar);
38+
$cents = fmod($fractionalDollar, 1);
39+
$cents /= $fraction;
40+
$cents *= 10 ** ceil(log10($fraction));
41+
42+
return $dollars + $cents;
43+
}
44+
45+
/**
46+
* DOLLARFR.
47+
*
48+
* Converts a dollar price expressed as a decimal number into a dollar price
49+
* expressed as a fraction.
50+
* Fractional dollar numbers are sometimes used for security prices.
51+
*
52+
* Excel Function:
53+
* DOLLARFR(decimal_dollar,fraction)
54+
*
55+
* @param float $decimalDollar Decimal Dollar
56+
* @param int $fraction Fraction
57+
*
58+
* @return float|string
59+
*/
60+
public static function fractional($decimalDollar = null, $fraction = 0)
61+
{
62+
$decimalDollar = Functions::flattenSingleValue($decimalDollar);
63+
$fraction = (int) Functions::flattenSingleValue($fraction);
64+
65+
// Validate parameters
66+
if ($decimalDollar === null || $fraction < 0) {
67+
return Functions::NAN();
68+
}
69+
if ($fraction == 0) {
70+
return Functions::DIV0();
71+
}
72+
73+
$dollars = floor($decimalDollar);
74+
$cents = fmod($decimalDollar, 1);
75+
$cents *= $fraction;
76+
$cents *= 10 ** (-ceil(log10($fraction)));
77+
78+
return $dollars + $cents;
79+
}
80+
}

0 commit comments

Comments
 (0)