AggregateMoneyParser.php
4 years ago
BitcoinMoneyParser.php
4 years ago
DecimalMoneyParser.php
4 years ago
IntlLocalizedDecimalParser.php
4 years ago
IntlMoneyParser.php
4 years ago
BitcoinMoneyParser.php
83 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Money\Parser; |
| 4 | |
| 5 | use Money\Currencies\BitcoinCurrencies; |
| 6 | use Money\Currency; |
| 7 | use Money\Exception\ParserException; |
| 8 | use Money\Money; |
| 9 | use Money\MoneyParser; |
| 10 | |
| 11 | /** |
| 12 | * Parses Bitcoin currency to Money. |
| 13 | * |
| 14 | * @author Frederik Bosch <f.bosch@genkgo.nl> |
| 15 | */ |
| 16 | final class BitcoinMoneyParser implements MoneyParser |
| 17 | { |
| 18 | /** |
| 19 | * @var int |
| 20 | */ |
| 21 | private $fractionDigits; |
| 22 | |
| 23 | /** |
| 24 | * @param int $fractionDigits |
| 25 | */ |
| 26 | public function __construct($fractionDigits) |
| 27 | { |
| 28 | $this->fractionDigits = $fractionDigits; |
| 29 | } |
| 30 | |
| 31 | /** |
| 32 | * {@inheritdoc} |
| 33 | */ |
| 34 | public function parse($money, $forceCurrency = null) |
| 35 | { |
| 36 | if (is_string($money) === false) { |
| 37 | throw new ParserException('Formatted raw money should be string, e.g. $1.00'); |
| 38 | } |
| 39 | |
| 40 | if (strpos($money, BitcoinCurrencies::SYMBOL) === false) { |
| 41 | throw new ParserException('Value cannot be parsed as Bitcoin'); |
| 42 | } |
| 43 | |
| 44 | if ($forceCurrency === null) { |
| 45 | $forceCurrency = new Currency(BitcoinCurrencies::CODE); |
| 46 | } |
| 47 | |
| 48 | /* |
| 49 | * This conversion is only required whilst currency can be either a string or a |
| 50 | * Currency object. |
| 51 | */ |
| 52 | $currency = $forceCurrency; |
| 53 | if (!$currency instanceof Currency) { |
| 54 | @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); |
| 55 | $currency = new Currency($currency); |
| 56 | } |
| 57 | |
| 58 | $decimal = str_replace(BitcoinCurrencies::SYMBOL, '', $money); |
| 59 | $decimalSeparator = strpos($decimal, '.'); |
| 60 | |
| 61 | if (false !== $decimalSeparator) { |
| 62 | $decimal = rtrim($decimal, '0'); |
| 63 | $lengthDecimal = strlen($decimal); |
| 64 | $decimal = str_replace('.', '', $decimal); |
| 65 | $decimal .= str_pad('', ($lengthDecimal - $decimalSeparator - $this->fractionDigits - 1) * -1, '0'); |
| 66 | } else { |
| 67 | $decimal .= str_pad('', $this->fractionDigits, '0'); |
| 68 | } |
| 69 | |
| 70 | if (substr($decimal, 0, 1) === '-') { |
| 71 | $decimal = '-'.ltrim(substr($decimal, 1), '0'); |
| 72 | } else { |
| 73 | $decimal = ltrim($decimal, '0'); |
| 74 | } |
| 75 | |
| 76 | if ('' === $decimal) { |
| 77 | $decimal = '0'; |
| 78 | } |
| 79 | |
| 80 | return new Money($decimal, $currency); |
| 81 | } |
| 82 | } |
| 83 |