Open Journal Systems  3.3.0
BitcoinMoneyFormatter.php
1 <?php
2 
3 namespace Money\Formatter;
4 
8 use Money\Money;
10 use Money\Number;
11 
17 final class BitcoinMoneyFormatter implements MoneyFormatter
18 {
22  private $fractionDigits;
23 
27  private $currencies;
28 
33  public function __construct($fractionDigits, Currencies $currencies)
34  {
35  $this->fractionDigits = $fractionDigits;
36  $this->currencies = $currencies;
37  }
38 
42  public function format(Money $money)
43  {
44  if (BitcoinCurrencies::CODE !== $money->getCurrency()->getCode()) {
45  throw new FormatterException('Bitcoin Formatter can only format Bitcoin currency');
46  }
47 
48  $valueBase = $money->getAmount();
49  $negative = false;
50 
51  if ('-' === $valueBase[0]) {
52  $negative = true;
53  $valueBase = substr($valueBase, 1);
54  }
55 
56  $subunit = $this->currencies->subunitFor($money->getCurrency());
57  $valueBase = Number::roundMoneyValue($valueBase, $this->fractionDigits, $subunit);
58  $valueLength = strlen($valueBase);
59 
60  if ($valueLength > $subunit) {
61  $formatted = substr($valueBase, 0, $valueLength - $subunit);
62 
63  if ($subunit) {
64  $formatted .= '.';
65  $formatted .= substr($valueBase, $valueLength - $subunit);
66  }
67  } else {
68  $formatted = '0.'.str_pad('', $subunit - $valueLength, '0').$valueBase;
69  }
70 
71  if ($this->fractionDigits === 0) {
72  $formatted = substr($formatted, 0, strpos($formatted, '.'));
73  } elseif ($this->fractionDigits > $subunit) {
74  $formatted .= str_pad('', $this->fractionDigits - $subunit, '0');
75  } elseif ($this->fractionDigits < $subunit) {
76  $lastDigit = strpos($formatted, '.') + $this->fractionDigits + 1;
77  $formatted = substr($formatted, 0, $lastDigit);
78  }
79 
80  $formatted = BitcoinCurrencies::SYMBOL.$formatted;
81 
82  if (true === $negative) {
83  $formatted = '-'.$formatted;
84  }
85 
86  return $formatted;
87  }
88 }
Money\Exception\FormatterException
Definition: FormatterException.php:12
Money\Money
Definition: Money.php:16
Money
Money\Currencies
Definition: AggregateCurrencies.php:3
Money\Currencies\BitcoinCurrencies\CODE
const CODE
Definition: BitcoinCurrencies.php:14
Money\Number
Definition: paymethod/paypal/vendor/moneyphp/money/src/Number.php:10
Money\Formatter
Definition: AggregateMoneyFormatter.php:3
Money\MoneyFormatter
Definition: MoneyFormatter.php:10
Money\Formatter\BitcoinMoneyFormatter
Definition: BitcoinMoneyFormatter.php:17
Money\Formatter\BitcoinMoneyFormatter\format
format(Money $money)
Definition: BitcoinMoneyFormatter.php:48
Money\Currencies\BitcoinCurrencies\SYMBOL
const SYMBOL
Definition: BitcoinCurrencies.php:16
Money\Formatter\BitcoinMoneyFormatter\__construct
__construct($fractionDigits, Currencies $currencies)
Definition: BitcoinMoneyFormatter.php:39
Money\Currencies
Definition: Currencies.php:12
Money\Number\roundMoneyValue
static roundMoneyValue($moneyValue, $targetDigits, $havingDigits)
Definition: paymethod/paypal/vendor/moneyphp/money/src/Number.php:309
Money\Money\getCurrency
getCurrency()
Definition: Money.php:216
Money\Money\getAmount
getAmount()
Definition: Money.php:206
Money\Currencies\BitcoinCurrencies
Definition: BitcoinCurrencies.php:12