Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
50.00% |
1 / 2 |
CRAP | |
97.37% |
37 / 38 |
| IntlMoneyParser | |
0.00% |
0 / 1 |
|
50.00% |
1 / 2 |
10 | |
97.37% |
37 / 38 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| parse | |
0.00% |
0 / 1 |
9 | |
97.14% |
34 / 35 |
|||
| <?php | |
| namespace Money\Parser; | |
| use Money\Currencies; | |
| use Money\Currency; | |
| use Money\Exception\ParserException; | |
| use Money\Money; | |
| use Money\MoneyParser; | |
| use Money\Number; | |
| /** | |
| * Parses a string into a Money object using intl extension. | |
| * | |
| * @author Frederik Bosch <f.bosch@genkgo.nl> | |
| */ | |
| final class IntlMoneyParser implements MoneyParser | |
| { | |
| /** | |
| * @var \NumberFormatter | |
| */ | |
| private $formatter; | |
| /** | |
| * @var Currencies | |
| */ | |
| private $currencies; | |
| /** | |
| * @param \NumberFormatter $formatter | |
| * @param Currencies $currencies | |
| */ | |
| public function __construct(\NumberFormatter $formatter, Currencies $currencies) | |
| { | |
| $this->formatter = $formatter; | |
| $this->currencies = $currencies; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function parse($money, $forceCurrency = null) | |
| { | |
| if (!is_string($money)) { | |
| throw new ParserException('Formatted raw money should be string, e.g. $1.00'); | |
| } | |
| $currencyCode = null; | |
| $decimal = $this->formatter->parseCurrency($money, $currencyCode); | |
| if (null !== $forceCurrency) { | |
| $currencyCode = $forceCurrency; | |
| } | |
| $currency = new Currency($currencyCode); | |
| if (false === $decimal) { | |
| throw new ParserException( | |
| 'Cannot parse '.$money.' to Money. '.$this->formatter->getErrorMessage() | |
| ); | |
| } | |
| $decimal = (string) $decimal; | |
| $subunit = $this->currencies->subunitFor($currency); | |
| $decimalPosition = strpos($decimal, '.'); | |
| if (false !== $decimalPosition) { | |
| $decimalLength = strlen($decimal); | |
| $fractionDigits = $decimalLength - $decimalPosition - 1; | |
| $decimal = str_replace('.', '', $decimal); | |
| $decimal = Number::roundMoneyValue($decimal, $subunit, $fractionDigits); | |
| if ($fractionDigits > $subunit) { | |
| $decimal = substr($decimal, 0, $decimalPosition + $subunit); | |
| } elseif ($fractionDigits < $subunit) { | |
| $decimal .= str_pad('', $subunit - $fractionDigits, '0'); | |
| } | |
| } else { | |
| $decimal .= str_pad('', $subunit, '0'); | |
| } | |
| if ('-' === $decimal[0]) { | |
| $decimal = '-'.ltrim(substr($decimal, 1), '0'); | |
| } else { | |
| $decimal = ltrim($decimal, '0'); | |
| } | |
| if ('' === $decimal) { | |
| $decimal = '0'; | |
| } | |
| return new Money($decimal, $currency); | |
| } | |
| } |