Aller au contenu

phil/money

alpha

Des montants d'argent sous forme d'entiers exacts dans une devise connue, sans aucun nombre à virgule flottante.

phil/money est un objet-valeur pour l'argent : un montant dans la plus petite unité de sa devise, et une devise que connaissent les données Unicode CLDR. Les montants s'additionnent, se soustraient, se multiplient par des nombres entiers et se comparent seulement à l'intérieur d'une même devise. Les décimaux se lisent et s'écrivent sous forme de chaînes, à la précision propre à la devise. Un montant se répartit selon des proportions ou en parts égales sans perdre ni créer d'unité, et s'affiche sous forme de MonetaryAmount ou de prix d'Offer de schema.org. La bibliothèque ne convertit pas les devises, ne garde aucun taux de change, n'arrondit pas les fractions d'unité, ne met pas en forme les montants pour l'affichage et ne sait pas quelles devises une application accepte.

Elle s'adresse à tout code PHP qui manipule des prix, des totaux ou des remboursements et qui ne peut pas se permettre de perdre un cent à cause de l'arrondi des nombres à virgule flottante. Les autres paquets phil/* qui traitent des montants, comme phil/tax et phil/commerce-bundle, parlent tous son Money.

C'est une simple bibliothèque PHP sans cadriciel, construite sur symfony/intl pour les données des devises. Dans une application Symfony, tournez-vous vers phil/money-bundle, qui ajoute les devises acceptées, un type de formulaire, la validation, Twig et Doctrine.

Deux types immuables portent la conception, Money et Currency. Chaque opération retourne une nouvelle valeur, et une opération entre deux devises lance une exception au lieu de deviner.

État

PartieÉtat
Currency : codes ISO 4217 connus des données CLDR, précision, nom et symbole localisésImplémenté et testé
Money : arithmétique entière, comparaison, lecture et écriture des décimauxImplémenté et testé
Répartition selon des proportions et en parts égalesImplémenté et testé
SchemaOrg : MonetaryAmount et prix d'Offer de schema.orgImplémenté et testé
Exceptions sous une seule interface MoneyExceptionImplémenté et testé

Documentation

DocumentContenu
InstallationLes prérequis et l'installation.
DevisesCurrency : les codes acceptés, la précision, le nom et le symbole.
MontantsMoney : la création, les décimaux, l'arithmétique, la comparaison et l'intervalle des entiers.
Répartitionallocate() et split() : comment les unités restantes sont distribuées.
ExceptionsMoneyException et les trois exceptions, avec leurs messages.
Points d'extensionLes ports, les arguments et les données qu'une application choisit ou remplace.
TestsLes tests de la bibliothèque et son seuil de mutation, et comment tester du code qui compte de l'argent.
RéférenceChaque type de la bibliothèque, avec son rôle.

Démarrage rapide

composer require phil/money
use Phil\Money\Currency;
use Phil\Money\Money;

$cad = Currency::of('CAD');

$price = Money::ofDecimal('19.99', $cad);
$total = $price->multiply(3)->add(Money::of(500, $cad));
$total->toDecimal(); // "64.97"

[$first, $second, $third] = Money::ofDecimal('100', $cad)->split(3); // 33.34, 33.33, 33.33

Prérequis

PHP 8.5 ou plus récent avec ext-intl, et symfony/intl 8.2 pour les données des devises.

Contribuer

Les contributions sont les bienvenues sur le monodépôt PHIL : lisez le guide de contribution et le code de conduite. Signalez une vulnérabilité en privé, comme l'explique la politique de sécurité, jamais dans un ticket public.

Licence

MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Parler Haut Interagir Librement project. Voir LICENSE.