Répartition
phil/moneyRépartir un montant ne doit ni perdre ni créer d'unité : trois personnes qui partagent 1.00 paient 0.34, 0.33 et 0.33, et les parts donnent de nouveau 1.00 une fois additionnées.
allocate(int ...$ratios): list<Money>
Répartit le montant selon des proportions. Chaque part reçoit sa quote-part arrondie vers le bas ; les unités restantes vont une à une aux parts dont la quote-part a été le plus arrondie vers le bas (le plus fort reste), la première part l'emportant en cas d'égalité.
$cad = Currency::of('CAD');
Money::of(100, $cad)->allocate(1, 1, 1); // 34, 33, 33
Money::of(100, $cad)->allocate(1, 1, 5); // 14, 14, 72: 71.43 was rounded down the most
Money::of(5, $cad)->allocate(3, 7); // 2, 3: a tie goes to the earlier part
Money::of(5, $cad)->allocate(0, 1, 1); // 0, 3, 2: a ratio of 0 receives nothing
Money::of(-100, $cad)->allocate(1, 1, 1); // -34, -33, -33
Une proportion est un nombre entier, nul ou positif ; au moins une proportion est donnée, et leur somme n'est pas nulle.
Une répartition en pourcentages s'écrit en proportions entières : allocate(70, 30), ou allocate(9_975, 5_000) pour
des taux à décimales. Le résultat est une liste, quelles que soient les clés des proportions.
split(int $parts): list<Money>
Répartit le montant en parts égales, les premières parts recevant les unités restantes.
Money::of(100, $cad)->split(3); // 34, 33, 33
Money::of(11, $cad)->split(3); // 4, 4, 3
Money::of(-100, $cad)->split(3); // -34, -33, -33
Refus
Tous sont des InvalidAmount : aucune proportion ; une proportion négative ; des proportions dont la somme est nulle ;
des proportions, ou le montant multiplié par une proportion, hors de l'entier natif ; moins d'une part.