Zaokrúhľovanie a pomocné triedy
Všetko zaokrúhľovanie používa natívny enum \RoundingMode z PHP 8.4 — ten istý, ktorý prijíma round() aj bcround(). Hodnotové objekty majú ako konštantu predvolený HalfAwayFromZero a konfiguráciu nečítajú; služby čítajú money.rounding (formátovač, avgMoney) a money.exchange.rounding (prevody).
| RoundingMode | Hodnota v konfigurácii | 2.5 | -2.5 | 1.6 | -1.1 |
|---|---|---|---|---|---|
HalfAwayFromZero | half_away_from_zero | 3 | -3 | 2 | -1 |
HalfTowardsZero | half_towards_zero | 2 | -2 | 2 | -1 |
HalfEven | half_even | 2 | -2 | 2 | -1 |
HalfOdd | half_odd | 3 | -3 | 2 | -1 |
TowardsZero | towards_zero | 2 | -2 | 1 | -1 |
AwayFromZero | away_from_zero | 3 | -3 | 2 | -2 |
PositiveInfinity | positive_infinity | 3 | -2 | 2 | -1 |
NegativeInfinity | negative_infinity | 2 | -3 | 1 | -2 |
use RoundlyConsulting\Money\Percentage;
use RoundlyConsulting\Money\Ratio;
$ten = Money::ofMajor('10', 'EUR');
$ten->divide(3); // 3.33 EUR (HalfAwayFromZero)
$ten->divide(3, RoundingMode::PositiveInfinity); // 3.34 EUR
$ten->multiply(Ratio::of(2, 3)); // 6.67 EUR — exact ratio, one rounding
$ten->percentage(Percentage::fromBasisPoints(850)); // 0.85 EUR (8.5 %)
Ratio::of('1.0854'); // 5427/5000
Ratio::of(1, 3)->toDecimal(4); // "0.3333"
Ratio::of(1, 3)->toExactDecimal(); // null — does not terminate
Percentage::of('8.5')->basisPoints(); // 850Ratio a Percentage
Ratio je presný zlomok — skrátený, s kladným menovateľom a členmi do 80 číslic. Percentage je nezáporné desatinné percento s najviac 6 desatinnými miestami (Percentage::of(), fromBasisPoints(), fromRatio()). Oba vstupujú do multiply(), divide() a percentage() bez jediného floatu.
MinorUnits
Pomocné metódy bez meny pre kredity, body a sumy z SDK poskytovateľov — na vstupe int|string, na výstupe reťazce, škály 0..36:
use RoundlyConsulting\Money\Math\MinorUnits;
MinorUnits::normalize('007'); // "7"
MinorUnits::toDecimal(123450, 2); // "1234.50"
MinorUnits::fromDecimal('10.5', 2); // "1050" — excess precision needs a rounding mode
MinorUnits::rescale(123450, 2, 0); // "1235"
MinorUnits::toInt('6747'); // 6747 — throws AmountOverflow outside int64Zaokrúhľovanie z vlastnej konfigurácie
RoundingModes prevádza hodnoty z konfigurácie v snake_case na enum. Nenastavená hodnota (null alebo prázdna) dostane voliteľnú predvolenú hodnotu z tretieho argumentu, inak vyhodí výnimku. Čokoľvek iné — vrátane nejednoznačného half_up — vyhodí InvalidMoneyConfiguration s názvom kľúča:
use RoundlyConsulting\Money\Support\RoundingModes;
RoundingModes::fromValue(config('shop.rounding'), 'shop.rounding'); // RoundingMode
RoundingModes::fromValue(config('shop.rounding'), 'shop.rounding', RoundingMode::HalfEven); // null or blank → HalfEven
RoundingModes::fromConfig('money.rounding'); // RoundingMode::HalfAwayFromZero
RoundingModes::toValue(RoundingMode::HalfEven); // "half_even"Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.