Rozdeľovanie súm
Rozdeľte sumu bez toho, aby sa stratila alebo pribudla najmenšia jednotka. allocate() prijíma pomery — inty, celočíselné reťazce alebo desatinné čísla. Každá časť sa od svojho presného podielu líši najviac o jednu najmenšiu jednotku a časti dokopy vždy dajú pôvodnú sumu:
$total = Money::ofMajor('100', 'EUR');
[$a, $b, $c] = $total->allocate(1, 1, 1); // 33.34, 33.33, 33.33 — sums back to 100.00
$total->allocate(70, 30); // 70.00, 30.00
$total->allocate('0.5', '0.25', '0.25'); // 50.00, 25.00, 25.00 — decimal ratios work too
$total->split(3); // same as allocate(1, 1, 1)
Money::ofMajor('30', 'EUR')->ratioTo(Money::ofMajor('120', 'EUR')); // Ratio 1/4, exactAko to funguje
- Každý podiel je ⌊|suma| × pomer / Σ pomerov⌋; zvyšné jednotky dostanú po jednej časti s najväčším presným zvyškom, pri zhode tá s nižším indexom.
- Znamienko sa aplikuje až potom, takže záporné sumy sa delia symetricky.
- Časti s nulovým pomerom dostanú nulu.
- split($parts) je allocate() s rovnakými pomermi, pre 1 až 10 000 častí.
- Žiadne pomery, záporný pomer alebo nulový súčet vyhodia InvalidAllocation.
Zľava objednávky na položky
DiscountAllocator rozpočíta zľavu celej objednávky na súčty položiek tou istou metódou najväčších zvyškov, váženou sumami položiek. Podiely dajú dokopy presne výšku zľavy a žiadny podiel nikdy neprekročí svoju položku:
use RoundlyConsulting\Money\Discounts\DiscountAllocator;
$shares = app(DiscountAllocator::class)->allocate(
Money::ofMajor('10', 'EUR'), // the order-level discount
Money::ofMajor('30', 'EUR'), // line totals…
Money::ofMajor('20', 'EUR'),
Money::ofMajor('50', 'EUR'),
);
// 3.00, 2.00, 5.00 EUR — the shares sum to the discount, and 0 ≤ share ≤ lineZľava vyššia ako všetky položky spolu vyhodí InvalidDiscount; zmiešané meny vyhodia CurrencyMismatch. Alokátor je zaregistrovaný ako singleton.
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.