Aritmetika a porovnávanie
Aritmetika a porovnávanie fungujú v rámci jednej meny — miešanie mien vyhodí CurrencyMismatch a prevod je vždy samostatný, explicitný krok. Bezstratové operácie nikdy nezaokrúhľujú; stratové zaokrúhlia presne raz, predvolene RoundingMode::HalfAwayFromZero:
$price = Money::ofMajor('19.99', 'EUR');
$fee = Money::ofMinor(250, 'EUR');
$total = $price->add($fee)->multiply(3); // 67.47 EUR, exact
$net = $total->subtract($fee); // 64.97 EUR
$vat = $total->percentage('20'); // 13.49 EUR — one rounding, HalfAwayFromZero
$net->multiply('1.19'); // 77.31 EUR — a decimal factor rounds once
$total->divide(4); // 16.87 EUR
Money::ofMajor('10.03', 'CHF')->roundTo(5); // 10.05 CHF — 5-Rappen cash rounding
$total->negate(); // -67.47 EUR
$total->negate()->abs(); // 67.47 EUR
$total->add(Money::ofMajor('1', 'USD')); // throws CurrencyMismatch- add() / subtract() — variadické, presné, nikdy nezaokrúhľujú.
- multiply($factor, $rounding) — celočíselný násobok je presný; desatinný reťazec ('1.19') alebo Ratio zaokrúhli raz.
- divide($divisor, $rounding) — zaokrúhli raz; delenie nulou vyhodí DivisionByZero.
- percentage($percent, $rounding) — suma × p / 100, zaokrúhlené raz.
- roundTo($minorIncrement, $rounding) — hotovostné zaokrúhlenie na násobok kroku, napr. roundTo(5) pre švajčiarske 5-rappenové kroky.
- negate() / abs() — nikdy nezaokrúhľujú.
Násobky a delitele musia byť obyčajné desatinné alebo celé čísla — '1e3', '1,5' či ' 2' vyhodia InvalidAmount. Výsledky sú obmedzené na 65 číslic.
Porovnávanie
$a = Money::ofMajor('50', 'EUR');
$b = Money::ofMajor('67.47', 'EUR');
$b->isGreaterThan($a); // true
$b->isGreaterThanOrEqualTo($a); // true
$a->isLessThan($b); // true
$a->isLessThanOrEqualTo($b); // true
$a->compareTo($b); // -1
$a->equals(Money::ofMinor(5000, 'EUR')); // true
$a->equals(Money::ofMajor('50', 'USD')); // false — equals() never throws
$a->isSameCurrency($b); // true
$a->isZero(); $a->isPositive(); $a->isNegative();
$a->isGreaterThan(Money::ofMajor('1', 'USD')); // throws CurrencyMismatchequals() porovnáva sumu, kód meny aj exponent a nikdy nevyhodí výnimku. Každá metóda na usporiadanie vyhodí pri rôznych menách CurrencyMismatch. Porovnania bežia nad kanonickými reťazcami — bez bcmath, bez floatu.
Agregácie
$prices = [
Money::ofMajor('10', 'EUR'),
Money::ofMajor('25.50', 'EUR'),
Money::ofMajor('4.99', 'EUR'),
];
Money::sum($prices); // 40.49 EUR
Money::sum([], currencyIfEmpty: 'EUR'); // 0.00 EUR
Money::min($prices); // 4.99 EUR
Money::max($prices); // 25.50 EUR
Money::average($prices); // 13.50 EUR — rounded oncesum() prázdneho zoznamu potrebuje currencyIfEmpty, inak vyhodí EmptyMoneyCollection — rovnako ako min(), max() a average() bez prvkov. Položky, ktoré nie sú Money, vyhodia InvalidMoneyValue; zmiešané meny vyhodia CurrencyMismatch.
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.