PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.16.9
GiveWP – Donation Plugin and Fundraising Platform v4.16.9
4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 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 All 255 releases
give / vendor / moneyphp / money / src / Parser / IntlLocalizedDecimalParser.php

IntlLocalizedDecimalParser.php in GiveWP – Donation Plugin and Fundraising Platform 4.16.9, at vendor/moneyphp/money/src/Parser/IntlLocalizedDecimalParser.php

95 lines 2.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Money\Parser;
4
5 use Money\Currencies;
6 use Money\Currency;
7 use Money\Exception\ParserException;
8 use Money\Money;
9 use Money\MoneyParser;
10 use Money\Number;
11
12 /**
13 * Parses a string into a Money object using intl extension.
14 *
15 * @author Frederik Bosch <f.bosch@genkgo.nl>
16 */
17 final class IntlLocalizedDecimalParser implements MoneyParser
18 {
19 /**
20 * @var \NumberFormatter
21 */
22 private $formatter;
23
24 /**
25 * @var Currencies
26 */
27 private $currencies;
28
29 public function __construct(\NumberFormatter $formatter, Currencies $currencies)
30 {
31 $this->formatter = $formatter;
32 $this->currencies = $currencies;
33 }
34
35 /**
36 * {@inheritdoc}
37 */
38 public function parse($money, $forceCurrency = null)
39 {
40 if (!is_string($money)) {
41 throw new ParserException('Formatted raw money should be string, e.g. $1.00');
42 }
43
44 if (null === $forceCurrency) {
45 throw new ParserException('IntlLocalizedDecimalParser cannot parse currency symbols. Use forceCurrency argument');
46 }
47
48 $decimal = $this->formatter->parse($money);
49
50 if (false === $decimal) {
51 throw new ParserException('Cannot parse '.$money.' to Money. '.$this->formatter->getErrorMessage());
52 }
53
54 /*
55 * This conversion is only required whilst currency can be either a string or a
56 * Currency object.
57 */
58 if (!$forceCurrency instanceof Currency) {
59 @trigger_error('Passing a currency as string is deprecated since 3.1 and will be removed in 4.0. Please pass a '.Currency::class.' instance instead.', E_USER_DEPRECATED);
60 $forceCurrency = new Currency($forceCurrency);
61 }
62
63 $decimal = (string) $decimal;
64 $subunit = $this->currencies->subunitFor($forceCurrency);
65 $decimalPosition = strpos($decimal, '.');
66
67 if (false !== $decimalPosition) {
68 $decimalLength = strlen($decimal);
69 $fractionDigits = $decimalLength - $decimalPosition - 1;
70 $decimal = str_replace('.', '', $decimal);
71 $decimal = Number::roundMoneyValue($decimal, $subunit, $fractionDigits);
72
73 if ($fractionDigits > $subunit) {
74 $decimal = substr($decimal, 0, $decimalPosition + $subunit);
75 } elseif ($fractionDigits < $subunit) {
76 $decimal .= str_pad('', $subunit - $fractionDigits, '0');
77 }
78 } else {
79 $decimal .= str_pad('', $subunit, '0');
80 }
81
82 if ('-' === $decimal[0]) {
83 $decimal = '-'.ltrim(substr($decimal, 1), '0');
84 } else {
85 $decimal = ltrim($decimal, '0');
86 }
87
88 if ('' === $decimal) {
89 $decimal = '0';
90 }
91
92 return new Money($decimal, $forceCurrency);
93 }
94 }
95