toDecimal(); } /** * Количество позиции: целое — как есть (`2`), дробное — меткой, в JSON станет `2.5`. * * @return int|string */ public static function quantity(Quantity $quantity) { return $quantity->isWhole() ? $quantity->getPieces() : self::QUANTITY_PREFIX . $quantity->toDecimal(); } /** * @param array $payload строки в UTF-8 */ public static function encode(array $payload): string { $json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); if ($json === false) { throw new RuntimeException('Не удалось сериализовать JSON: ' . json_last_error_msg()); } $result = preg_replace( [ '/"' . preg_quote(self::PREFIX, '/') . '([0-9]+\.[0-9]{2})"/', '/"' . preg_quote(self::QUANTITY_PREFIX, '/') . '([0-9]+\.[0-9]{1,3})"/', ], '$1', $json, ); if ($result === null) { throw new RuntimeException('Не удалось подставить суммы в JSON.'); } return $result; } }