/** * @param int|string $amount Amount, expressed in the smallest units of $currency (eg cents) * @param Currency $currency * * @throws \InvalidArgumentException If amount is not integer */ public function __construct($amount, Currency $currency) { if (filter_var($amount, FILTER_VALIDATE_INT) === false && !Number::fromString($amount)->isInteger()) { throw new \InvalidArgumentException('Amount must be an integer(ish) value'); } $this->amount = (string) $amount; $this->currency = $currency; }
/** * {@inheritdoc} */ public function round($number, $roundingMode) { if (Money::ROUND_HALF_POSITIVE_INFINITY === $roundingMode) { $number = Number::fromString((string) $number); if ($number->isHalf() === true) { return $this->castInteger(ceil((string) $number)); } return $this->castInteger(round((string) $number, 0, Money::ROUND_HALF_UP)); } if (Money::ROUND_HALF_NEGATIVE_INFINITY === $roundingMode) { $number = Number::fromString((string) $number); if ($number->isHalf() === true) { return $this->castInteger(floor((string) $number)); } return $this->castInteger(round((string) $number, 0, Money::ROUND_HALF_DOWN)); } return $this->castInteger(round($number, 0, $roundingMode)); }
/** * {@inheritdoc} */ public function round($number, $roundingMode) { $number = Number::fromString((string) $number); if ($number->isDecimal() === false) { return (string) $number; } if ($number->isHalf() === false) { return $this->roundDigit($number); } if (Money::ROUND_HALF_UP === $roundingMode) { return bcadd((string) $number, $number->getIntegerRoundingMultiplier(), 0); } if (Money::ROUND_HALF_DOWN === $roundingMode) { return bcadd((string) $number, '0', 0); } if (Money::ROUND_HALF_EVEN === $roundingMode) { if ($number->isCurrentEven() === true) { return bcadd((string) $number, '0', 0); } return bcadd((string) $number, $number->getIntegerRoundingMultiplier(), 0); } if (Money::ROUND_HALF_ODD === $roundingMode) { if ($number->isCurrentEven() === true) { return bcadd((string) $number, $number->getIntegerRoundingMultiplier(), 0); } return bcadd((string) $number, '0', 0); } if (Money::ROUND_HALF_POSITIVE_INFINITY === $roundingMode) { if ($number->isNegative() === true) { return bcadd((string) $number, '0', 0); } return bcadd((string) $number, $number->getIntegerRoundingMultiplier(), 0); } if (Money::ROUND_HALF_NEGATIVE_INFINITY === $roundingMode) { if ($number->isNegative() === true) { return bcadd((string) $number, $number->getIntegerRoundingMultiplier(), 0); } return bcadd((string) $number, '0', 0); } throw new \InvalidArgumentException('Unknown rounding mode'); }