PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.14.2
GiveWP – Donation Plugin and Fundraising Platform v4.14.2
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / vendor / moneyphp / money / src / Calculator / PhpCalculator.php
give / vendor / moneyphp / money / src / Calculator Last commit date
BcMathCalculator.php 1 year ago GmpCalculator.php 4 years ago PhpCalculator.php 4 years ago
PhpCalculator.php
198 lines
1 <?php
2
3 namespace Money\Calculator;
4
5 use Money\Calculator;
6 use Money\Money;
7 use Money\Number;
8
9 /**
10 * @author Frederik Bosch <f.bosch@genkgo.nl>
11 */
12 final class PhpCalculator implements Calculator
13 {
14 /**
15 * {@inheritdoc}
16 */
17 public static function supported()
18 {
19 return true;
20 }
21
22 /**
23 * {@inheritdoc}
24 */
25 public function compare($a, $b)
26 {
27 return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
28 }
29
30 /**
31 * {@inheritdoc}
32 */
33 public function add($amount, $addend)
34 {
35 $result = $amount + $addend;
36
37 $this->assertInteger($result);
38
39 return (string) $result;
40 }
41
42 /**
43 * {@inheritdoc}
44 */
45 public function subtract($amount, $subtrahend)
46 {
47 $result = $amount - $subtrahend;
48
49 $this->assertInteger($result);
50
51 return (string) $result;
52 }
53
54 /**
55 * {@inheritdoc}
56 */
57 public function multiply($amount, $multiplier)
58 {
59 $result = $amount * $multiplier;
60
61 $this->assertIntegerBounds($result);
62
63 return (string) Number::fromNumber($result);
64 }
65
66 /**
67 * {@inheritdoc}
68 */
69 public function divide($amount, $divisor)
70 {
71 $result = $amount / $divisor;
72
73 $this->assertIntegerBounds($result);
74
75 return (string) Number::fromNumber($result);
76 }
77
78 /**
79 * {@inheritdoc}
80 */
81 public function ceil($number)
82 {
83 return $this->castInteger(ceil($number));
84 }
85
86 /**
87 * {@inheritdoc}
88 */
89 public function floor($number)
90 {
91 return $this->castInteger(floor($number));
92 }
93
94 /**
95 * {@inheritdoc}
96 */
97 public function absolute($number)
98 {
99 $result = ltrim($number, '-');
100
101 $this->assertIntegerBounds($result);
102
103 return (string) $result;
104 }
105
106 /**
107 * {@inheritdoc}
108 */
109 public function round($number, $roundingMode)
110 {
111 if (Money::ROUND_HALF_POSITIVE_INFINITY === $roundingMode) {
112 $number = Number::fromNumber($number);
113
114 if ($number->isHalf()) {
115 return $this->castInteger(ceil((string) $number));
116 }
117
118 return $this->castInteger(round((string) $number, 0, Money::ROUND_HALF_UP));
119 }
120
121 if (Money::ROUND_HALF_NEGATIVE_INFINITY === $roundingMode) {
122 $number = Number::fromNumber($number);
123
124 if ($number->isHalf()) {
125 return $this->castInteger(floor((string) $number));
126 }
127
128 return $this->castInteger(round((string) $number, 0, Money::ROUND_HALF_DOWN));
129 }
130
131 return $this->castInteger(round($number, 0, $roundingMode));
132 }
133
134 /**
135 * {@inheritdoc}
136 */
137 public function share($amount, $ratio, $total)
138 {
139 return $this->castInteger(floor($amount * $ratio / $total));
140 }
141
142 /**
143 * {@inheritdoc}
144 */
145 public function mod($amount, $divisor)
146 {
147 $result = $amount % $divisor;
148
149 $this->assertIntegerBounds($result);
150
151 return (string) $result;
152 }
153
154 /**
155 * Asserts that an integer value didn't become something else
156 * (after some arithmetic operation).
157 *
158 * @param int $amount
159 *
160 * @throws \OverflowException If integer overflow occured
161 * @throws \UnderflowException If integer underflow occured
162 */
163 private function assertIntegerBounds($amount)
164 {
165 if ($amount > PHP_INT_MAX) {
166 throw new \OverflowException('You overflowed the maximum allowed integer (PHP_INT_MAX)');
167 } elseif ($amount < ~PHP_INT_MAX) {
168 throw new \UnderflowException('You underflowed the minimum allowed integer (PHP_INT_MAX)');
169 }
170 }
171
172 /**
173 * Casts an amount to integer ensuring that an overflow/underflow did not occur.
174 *
175 * @param int $amount
176 *
177 * @return string
178 */
179 private function castInteger($amount)
180 {
181 $this->assertIntegerBounds($amount);
182
183 return (string) intval($amount);
184 }
185
186 /**
187 * Asserts that integer remains integer after arithmetic operations.
188 *
189 * @param int $amount
190 */
191 private function assertInteger($amount)
192 {
193 if (filter_var($amount, FILTER_VALIDATE_INT) === false) {
194 throw new \UnexpectedValueException('The result of arithmetic operation is not an integer');
195 }
196 }
197 }
198