phpexperts/money

A PHP library for a precise money handling data type. Avoids floating point rounding errors.

v2.1.0 2023-07-23 17:19 UTC

This package is auto-updated.

Last update: 2024-04-23 18:59:18 UTC


README

TravisCI Maintainability Test Coverage

MoneyType is a PHP Experts, Inc., Project meant to keep track of money precisely, even up to millions of dollars.

It is never safe to store money as floats or even integers times one hundred. This project gives you the security you need, so that something like the bug in "Office Space" just won't happen to your enterprise application.

Installation

Via Composer

composer require phpexperts/money

Usage

use PHPExperts\MoneyType\Money;

$money = new Money(5.22);

$money->add(0.55);
echo "$money\n"; // 5.77

# It keeps precision much much better than mere cents.
$money->subtract(0.0001);
echo "$money\n"; // 5.77
$money->subtract(0.004);
echo "$money\n"; // 5.77
$money->subtract(0.001);
echo "$money\n"; // 5.76

# Actually, to the tenth decimal place.
# So it's Cryptocurrency-ready!
$money->multiply(55.7773);
echo "$money\n"; // 321.55

# But deep down, it stores the true values to many decimals (if you use BCMath).
echo $money->getWithFullPrecision() . "\n"; // 321.5508738395

$money->divide('1.000005');
echo "$money\n"; // 321.55
echo $money->getWithFullPrecision() . "\n"; // 321.5492660931

# You can also compare really large numbers with one another, up to 10 decimal places.
# PHP Experts' MoneyType is cryptocurrency ready! In fact, that's what it was designed for!
$money->compare(321.5492660931);       // 0 = equal
$money->compare(321.549266093009);     // -1 = less
$money->compare(321.5492660931000001); // 1 = more

# Get the object.
print_r($money);

# It is cryptocurrency ready:
# Converts Bitcoins to Satoshis
$btc = '1.55527331';
$satoshis = NumberHelper::convertToCents($btc, 8); // 155527331 (int)

Use cases

PHPExperts\MoneyType\Money
✔ Can only be instantiated with a numeric string
✔ Will report what strategy is being used
✔ Will use BCMath if it is available
✔ Will fall back to native php if necessary
✔ Proxies everything to its calculation strategy
✔ Confirm that the readme demo works

PHPExperts\MoneyType\Internal\BCMathCalcStrategy
✔ Can get the full precision value to more than sixteen decimals
✔ Can add with high precision
✔ Can subtract with high precision
✔ Can multiply with high precision
✔ Can divide with high precision
✔ Can compare two numbers with high precision
✔ Can compute high precision modulus
✔ Can compute the modulus of decimals
✔ Can round with high precision
✔ Can only be instantiated with a numeric string
✔ Access the object as a string to get its valuation
✔ Can add with cent precision
✔ Can subtract with cent precision
✔ Can multiply with cent precision
✔ Can divide with cent precision
✔ Can compare two numbers with cent precision
✔ Will not accept a non number for any operation

PHPExperts\MoneyType\Internal\NativeCalcStrategy
✔ Wont attempt operations with non numbers
✔ Can get the full precision value to two decimals
✔ Cannot compute the modulus of decimals
✔ Will throw an exception if asked to compute an integer modulus
✔ Can compute the modulus of integers if dev passes i am a dummy parameter
✔ Can only be instantiated with a numeric string
✔ Access the object as a string to get its valuation
✔ Can add with cent precision
✔ Can subtract with cent precision
✔ Can multiply with cent precision
✔ Can divide with cent precision
✔ Can compare two numbers with cent precision
✔ Will not accept a non number for any operation

PHPExperts\MoneyType\Internal\NumberHelper: A collection of functions for number manipulation.
✔ Will return true if given a float
✔ Will return true if given a float string
✔ Will return false if given an integer
✔ Will return false if given an integer string
✔ Will throw an exception if given anything else
✔ Can convert dollars to cents integer without precision loss
✔ Can convert bitcoins to satoshis

Testing

phpunit

Contributors

Theodore R. Smith theodore@phpexperts.pro
GPG Fingerprint: 4BF8 2613 1C34 87AC D28F 2AD8 EB24 A91D D612 5690
CEO: PHP Experts, Inc.

[Alix Axel]
who contributed the base version of our "bcround()" function from https://stackoverflow.com/a/1653826/430062.

License

MIT license. Please see the license file for more information.