setValue($value); } if ($currency !== null) { $this->setCurrency($currency); } } } /** * Возвращает значение суммы * @return string Сумма */ public function getValue() { $negative = ($this->_value < 0 ? '-' : ''); $mod = abs($this->_value); if ($mod < 10) { return $negative . '0.0' . $mod; } elseif ($mod < 100) { return $negative . '0.' . $mod; } else { return $negative . substr($mod, 0, -2) . '.' . substr($mod, -2); } } /** * Устанавливает сумму * @param string $value Сумма * * @throws EmptyPropertyValueException Генерируется если было передано пустое значение * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа * @throws InvalidPropertyValueException Генерируется если было передано не валидное значение */ public function setValue($value) { if ($value === null || $value === '') { throw new EmptyPropertyValueException('Empty amount value', 0, 'amount.value'); } if (!is_numeric($value)) { throw new InvalidPropertyValueTypeException('Invalid amount value type', 0, 'amount.value', $value); } $castedValue = (int)round($value * 100.0); $this->_value = $castedValue; } /** * Возвращает сумму в копейках в виде целого числа * @return int Сумма в копейках/центах */ public function getIntegerValue() { return $this->_value; } /** * Возвращает валюту * @return string Код валюты */ public function getCurrency() { return $this->_currency; } /** * Устанавливает код валюты * @param string $value Код валюты * * @throws EmptyPropertyValueException Генерируется если было передано пустое значение * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты */ public function setCurrency($value) { if ($value === null || $value === '') { throw new EmptyPropertyValueException('Empty currency value', 0, 'amount.currency'); } if (TypeCast::canCastToEnumString($value)) { $value = strtoupper((string)$value); if (CurrencyCode::valueExists($value)) { $this->_currency = $value; } else { throw new InvalidPropertyValueException( 'Invalid currency value: "' . $value . '"', 0, 'amount.currency', $value ); } } else { throw new InvalidPropertyValueTypeException('Invalid currency value type', 0, 'amount.currency', $value); } } /** * @return array */ public function jsonSerialize() { return array( 'value' => number_format($this->_value / 100.0, 2, '.', ''), 'currency' => $this->_currency, ); } }