PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.27.0
GiveWP – Donation Plugin and Fundraising Platform v2.27.0
4.16.4 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 / BcMathCalculator.php
give / vendor / moneyphp / money / src / Calculator Last commit date
BcMathCalculator.php 4 years ago GmpCalculator.php 4 years ago PhpCalculator.php 4 years ago
BcMathCalculator.php
244 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 BcMathCalculator implements Calculator
13 {
14 /**
15 * @var string
16 */
17 private $scale;
18
19 /**
20 * @param int $scale
21 */
22 public function __construct($scale = 14)
23 {
24 $this->scale = $scale;
25 }
26
27 /**
28 * {@inheritdoc}
29 */
30 public static function supported()
31 {
32 return extension_loaded('bcmath');
33 }
34
35 /**
36 * {@inheritdoc}
37 */
38 public function compare($a, $b)
39 {
40 return bccomp($a, $b, $this->scale);
41 }
42
43 /**
44 * {@inheritdoc}
45 */
46 public function add($amount, $addend)
47 {
48 return (string) Number::fromString(bcadd($amount, $addend, $this->scale));
49 }
50
51 /**
52 * {@inheritdoc}
53 *
54 * @param $amount
55 * @param $subtrahend
56 *
57 * @return string
58 */
59 public function subtract($amount, $subtrahend)
60 {
61 return (string) Number::fromString(bcsub($amount, $subtrahend, $this->scale));
62 }
63
64 /**
65 * {@inheritdoc}
66 */
67 public function multiply($amount, $multiplier)
68 {
69 $multiplier = Number::fromNumber($multiplier);
70
71 return bcmul($amount, (string) $multiplier, $this->scale);
72 }
73
74 /**
75 * {@inheritdoc}
76 */
77 public function divide($amount, $divisor)
78 {
79 $divisor = Number::fromNumber($divisor);
80
81 return bcdiv($amount, (string) $divisor, $this->scale);
82 }
83
84 /**
85 * {@inheritdoc}
86 */
87 public function ceil($number)
88 {
89 $number = Number::fromNumber($number);
90
91 if ($number->isInteger()) {
92 return (string) $number;
93 }
94
95 if ($number->isNegative()) {
96 return bcadd((string) $number, '0', 0);
97 }
98
99 return bcadd((string) $number, '1', 0);
100 }
101
102 /**
103 * {@inheritdoc}
104 */
105 public function floor($number)
106 {
107 $number = Number::fromNumber($number);
108
109 if ($number->isInteger()) {
110 return (string) $number;
111 }
112
113 if ($number->isNegative()) {
114 return bcadd((string) $number, '-1', 0);
115 }
116
117 return bcadd($number, '0', 0);
118 }
119
120 /**
121 * {@inheritdoc}
122 */
123 public function absolute($number)
124 {
125 return ltrim($number, '-');
126 }
127
128 /**
129 * {@inheritdoc}
130 */
131 public function round($number, $roundingMode)
132 {
133 $number = Number::fromNumber($number);
134
135 if ($number->isInteger()) {
136 return (string) $number;
137 }
138
139 if ($number->isHalf() === false) {
140 return $this->roundDigit($number);
141 }
142
143 if (Money::ROUND_HALF_UP === $roundingMode) {
144 return bcadd(
145 (string) $number,
146 $number->getIntegerRoundingMultiplier(),
147 0
148 );
149 }
150
151 if (Money::ROUND_HALF_DOWN === $roundingMode) {
152 return bcadd((string) $number, '0', 0);
153 }
154
155 if (Money::ROUND_HALF_EVEN === $roundingMode) {
156 if ($number->isCurrentEven()) {
157 return bcadd((string) $number, '0', 0);
158 }
159
160 return bcadd(
161 (string) $number,
162 $number->getIntegerRoundingMultiplier(),
163 0
164 );
165 }
166
167 if (Money::ROUND_HALF_ODD === $roundingMode) {
168 if ($number->isCurrentEven()) {
169 return bcadd(
170 (string) $number,
171 $number->getIntegerRoundingMultiplier(),
172 0
173 );
174 }
175
176 return bcadd((string) $number, '0', 0);
177 }
178
179 if (Money::ROUND_HALF_POSITIVE_INFINITY === $roundingMode) {
180 if ($number->isNegative()) {
181 return bcadd((string) $number, '0', 0);
182 }
183
184 return bcadd(
185 (string) $number,
186 $number->getIntegerRoundingMultiplier(),
187 0
188 );
189 }
190
191 if (Money::ROUND_HALF_NEGATIVE_INFINITY === $roundingMode) {
192 if ($number->isNegative()) {
193 return bcadd(
194 (string) $number,
195 $number->getIntegerRoundingMultiplier(),
196 0
197 );
198 }
199
200 return bcadd(
201 (string) $number,
202 '0',
203 0
204 );
205 }
206
207 throw new \InvalidArgumentException('Unknown rounding mode');
208 }
209
210 /**
211 * @param $number
212 *
213 * @return string
214 */
215 private function roundDigit(Number $number)
216 {
217 if ($number->isCloserToNext()) {
218 return bcadd(
219 (string) $number,
220 $number->getIntegerRoundingMultiplier(),
221 0
222 );
223 }
224
225 return bcadd((string) $number, '0', 0);
226 }
227
228 /**
229 * {@inheritdoc}
230 */
231 public function share($amount, $ratio, $total)
232 {
233 return $this->floor(bcdiv(bcmul($amount, $ratio, $this->scale), $total, $this->scale));
234 }
235
236 /**
237 * {@inheritdoc}
238 */
239 public function mod($amount, $divisor)
240 {
241 return bcmod($amount, $divisor);
242 }
243 }
244