PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.3
GiveWP – Donation Plugin and Fundraising Platform v4.16.3
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 1 year ago GmpCalculator.php 4 years ago PhpCalculator.php 4 years ago
BcMathCalculator.php
242 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 * @return string
212 */
213 private function roundDigit(Number $number)
214 {
215 if ($number->isCloserToNext()) {
216 return bcadd(
217 (string) $number,
218 $number->getIntegerRoundingMultiplier(),
219 0
220 );
221 }
222
223 return bcadd((string) $number, '0', 0);
224 }
225
226 /**
227 * {@inheritdoc}
228 */
229 public function share($amount, $ratio, $total)
230 {
231 return $this->floor(bcdiv(bcmul($amount, $ratio, $this->scale), $total, $this->scale));
232 }
233
234 /**
235 * {@inheritdoc}
236 */
237 public function mod($amount, $divisor)
238 {
239 return bcmod($amount, $divisor);
240 }
241 }
242