PHP code example of brick / money

1. Go to this page and download the library: Download brick/money library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

brick / money example snippets


use Brick\Money\Money;

$money = Money::of(50, 'USD'); // USD 50.00
$money = Money::of('19.9', 'USD'); // USD 19.90

$money = Money::of('123.456', 'USD'); // RoundingNecessaryException
$money = Money::of('123.456', 'USD', roundingMode: RoundingMode::Up); // USD 123.46

use Brick\Money\Money;

$money = Money::ofMinor(1234, 'USD'); // USD 12.34

use Brick\Money\Money;

$money = Money::of(50, 'USD');

echo $money->plus('4.99'); // USD 54.99
echo $money->minus(1); // USD 49.00
echo $money->multipliedBy('1.999'); // USD 99.95
echo $money->dividedBy(4); // USD 12.50

use Brick\Money\Money;

$cost = Money::of(25, 'USD');
$shipping = Money::of('4.99', 'USD');
$discount = Money::of('2.50', 'USD');

echo $cost->plus($shipping)->minus($discount); // USD 27.49

use Brick\Money\Money;

$a = Money::of(1, 'USD');
$b = Money::of(1, 'EUR');

$a->plus($b); // CurrencyMismatchException

use Brick\Money\Money;
use Brick\Math\RoundingMode;

$money = Money::of(50, 'USD');

$money->plus('0.999'); // RoundingNecessaryException
$money->plus('0.999', RoundingMode::Down); // USD 50.99

$money->minus('0.999'); // RoundingNecessaryException
$money->minus('0.999', RoundingMode::Up); // USD 49.01

$money->multipliedBy('1.2345'); // RoundingNecessaryException
$money->multipliedBy('1.2345', RoundingMode::Down); // USD 61.72

$money->dividedBy(3); // RoundingNecessaryException
$money->dividedBy(3, RoundingMode::Up); // USD 16.67

$oneEuro = Money::of(1, 'EUR');

$oneEuro->isEqualTo(Money::of(1, 'EUR')); // true
$oneEuro->isEqualTo(Money::of(2, 'EUR')); // false
$oneEuro->isEqualTo(Money::of(1, 'USD')); // CurrencyMismatchException

$oneEuro->isSameValueAs(Money::of(1, 'EUR')); // true
$oneEuro->isSameValueAs(Money::of(2, 'EUR')); // false
$oneEuro->isSameValueAs(Money::of(1, 'USD')); // false

use Brick\Money\Money;
use Brick\Money\Context\CashContext;
use Brick\Math\RoundingMode;

$money = Money::of(10, 'CHF', new CashContext(step: 5)); // CHF 10.00
$money->dividedBy(3, RoundingMode::Down); // CHF 3.30
$money->dividedBy(3, RoundingMode::Up); // CHF 3.35

use Brick\Money\Money;
use Brick\Money\Context\CustomContext;
use Brick\Math\RoundingMode;

$money = Money::of(10, 'USD', new CustomContext(scale: 4)); // USD 10.0000
$money->dividedBy(7, RoundingMode::Up); // USD 1.4286

use Brick\Money\Money;
use Brick\Money\Context\AutoContext;

$money = Money::of('1.10', 'USD', new AutoContext()); // USD 1.1
$money->multipliedBy('2.5'); // USD 2.75
$money->dividedBy(8); // USD 0.1375

use Brick\Money\Money;
use Brick\Math\RoundingMode;

$money = Money::of('9.5', 'EUR');                       // EUR 9.50 (Money)
$money = $money->toRational()                           // EUR 19/2 (RationalMoney)
  ->dividedBy(3)                                        // EUR 19/6 (RationalMoney)
  ->plus('17.795')                                      // EUR 12577/600 (RationalMoney)
  ->multipliedBy('1.196')                               // EUR 3760523/150000 (RationalMoney)
  ->toContext($money->getContext(), RoundingMode::Down) // EUR 25.07 (Money)

...
  ->toContext(new CustomContext(scale: 8), RoundingMode::Up); // EUR 25.07015334

use Brick\Money\Money;
use Brick\Money\SplitMode;

$money = Money::of(100, 'USD');
[$a, $b, $c] = $money->split(3, SplitMode::ToFirst); // USD 33.34, USD 33.33, USD 33.33

$money->split(3, SplitMode::Separate); // [USD 33.33, USD 33.33, USD 33.33, USD 0.01]

use Brick\Money\Money;
use Brick\Money\AllocationMode;

$profit = Money::of('987.65', 'CHF');

// CHF 474.08, CHF 404.93, CHF 108.64
[$a, $b, $c] = $profit->allocate([48, 41, 11], AllocationMode::FloorToFirst);

use Brick\Money\Money;
use Brick\Money\AllocationMode;
use Brick\Money\Context\CashContext;

$profit = Money::of('987.65', 'CHF', new CashContext(step: 5));

// CHF 474.10, CHF 404.95, CHF 108.60
[$a, $b, $c] = $profit->allocate([48, 41, 11], AllocationMode::FloorToFirst);

use Brick\Money\Money;
use Brick\Money\MoneyBag;

$eur = Money::of('12.34', 'EUR');
$jpy = Money::of(123, 'JPY');

$moneyBag = MoneyBag::of($eur, $jpy);

// or:

$moneyBag = MoneyBag::zero()->plus($eur)->plus($jpy);

use Brick\Money\CurrencyConverter;

$exchangeRateProvider = ...; // see below
$converter = new CurrencyConverter($exchangeRateProvider);

$money = Money::of('50', 'USD');
$converter->convert($money, 'EUR', roundingMode: RoundingMode::Down);

use Brick\Money\ExchangeRateProvider\ConfigurableProvider;

$provider = ConfigurableProvider::builder()
    ->addExchangeRate('EUR', 'USD', '1.0987')
    ->addExchangeRate('USD', 'EUR', '0.9123')
    ->build();

use Brick\Money\ExchangeRateProvider\ConfigurableProvider;
use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;

$provider = ConfigurableProvider::builder()
    ->addExchangeRate('EUR', 'USD', '1.1')
    ->addExchangeRate('EUR', 'GBP', '0.9')
    ->build();

$provider = new BaseCurrencyProvider($provider, 'EUR');
$provider->getExchangeRate(Currency::of('EUR'), Currency::of('USD')); // 1.1
$provider->getExchangeRate(Currency::of('USD'), Currency::of('EUR')); // 10/11
$provider->getExchangeRate(Currency::of('GBP'), Currency::of('USD')); // 11/9

use Brick\Money\ExchangeRateProvider\PdoProvider;

$pdo = new \PDO(...);

$provider = PdoProvider::builder($pdo, 'exchange_rates', 'exchange_rate')
    ->setSourceCurrencyColumn('source_currency_code')
    ->setTargetCurrencyColumn('target_currency_code')
    ->build();

use Brick\Money\ExchangeRateProvider\PdoProvider;
use Brick\Money\ExchangeRateProvider\Pdo\SqlCondition;

$provider = PdoProvider::builder($pdo, 'exchange_rates', 'exchange_rate')
    ->setSourceCurrencyColumn('source_currency_code')
    ->setTargetCurrencyColumn('target_currency_code')
    ->bindDimension('year', fn (int $year) => new SqlCondition('year = ?', $year))
    ->bindDimension('month', fn (int $month) => new SqlCondition('month = ?', $month))
    ->build();

use Brick\Money\Currency;

$rate = $provider->getExchangeRate(
    Currency::of('EUR'),
    Currency::of('USD'),
    ['year' => 2017, 'month' => 8],
);

use Brick\Math\RoundingMode;
use Brick\Money\CurrencyConverter;
use Brick\Money\Money;

$converter = new CurrencyConverter($provider);

$converter->convert(
    Money::of('10.00', 'EUR'),
    'USD',
    ['year' => 2017, 'month' => 8],
    roundingMode: RoundingMode::HalfUp,
);

$provider = PdoProvider::builder($pdo, 'exchange_rates', 'exchange_rate')
    ->setSourceCurrencyColumn('source_currency_code')
    ->setTargetCurrencyColumn('target_currency_code')
    ->bindDimension(
        'as_of',
        fn (\DateTimeInterface $date) => new SqlCondition(
            'year = ? AND month = ?',
            (int) $date->format('Y'),
            (int) $date->format('m'),
        ),
    )
    ->build();

$rate = $provider->getExchangeRate(
    Currency::of('EUR'),
    Currency::of('USD'),
    ['as_of' => new \DateTimeImmutable('2017-08-15')],
);

$provider = PdoProvider::builder($pdo, 'exchange_rates', 'exchange_rate')
    ->setSourceCurrencyColumn('source_currency_code')
    ->setTargetCurrencyColumn('target_currency_code')
    ->bindDimension('date', fn (string $date) => new SqlCondition('date <= ?', $date))
    ->orderBy('date', 'DESC')
    ->build();

use Brick\Money\ExchangeRateProvider\CachedProvider;

$cachedProvider = new CachedProvider($provider);

$cachedProvider = new CachedProvider(
    provider: $provider,
    cache: $yourPsr16Cache,
    ttl: 3600, // seconds
);

$cachedProvider = new CachedProvider(
    provider: $provider,
    cache: $yourPsr16Cache,
    dimensionObjectNormalizer: function (object $value) {
        if ($value instanceof YourCustomType) {
            return $value->toKey(); // string, int, float, bool accepted
        }

        return null; // fall back to built-in handling
    },
);

use Brick\Money\ExchangeRateProvider\ChainProvider;

$provider = new ChainProvider($primaryProvider, $fallbackProvider);

public function getExchangeRate(
    Currency $sourceCurrency,
    Currency $targetCurrency,
    array $dimensions = [],
): ?BigNumber;

use Brick\Money\Money;
use Brick\Money\MoneyComparator;
use Brick\Money\ComparisonMode\PairwiseMode;
use Brick\Money\ExchangeRateProvider\ConfigurableProvider;

$provider = ConfigurableProvider::builder()
    ->addExchangeRate('EUR', 'USD', '1.10')
    ->build();

$comparator = new MoneyComparator($provider, new PairwiseMode());

$eur = Money::of('10.00', 'EUR'); // worth USD 11.00 at this rate
$usd = Money::of('10.50', 'USD');

$comparator->compare($eur, $usd);   // 1 (EUR 10.00 is worth more than USD 10.50)
$comparator->isGreater($eur, $usd); // true
$comparator->max($eur, $usd);       // EUR 10.00 (the original instance, unchanged)

use Brick\Money\ComparisonMode\BaseCurrencyMode;

$comparator = new MoneyComparator($provider, new BaseCurrencyMode('USD'));

$comparator = new MoneyComparator($provider, new PairwiseMode(), ['year' => 2017, 'month' => 8]);

use Brick\Money\Currency;
use Brick\Money\Money;

$bitcoin = new Currency(
    'XBT',     // currency code
    null,      // numeric currency code, optional; set to null if unused
    'Bitcoin', // currency name
    8,         // default scale
);

$money = Money::of('0.123', $bitcoin); // XBT 0.12300000

$money = Money::of(5000, 'USD');
echo $money->formatToLocale('en_US'); // $5,000.00
echo $money->formatToLocale('fr_FR'); // 5 000,00 $US

use Brick\Money\Money;
use Brick\Money\Formatter\MoneyNumberFormatter;

$formatter = new \NumberFormatter('en_US', \NumberFormatter::CURRENCY);
$formatter->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, 'US$');
$formatter->setSymbol(\NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL, '·');
$formatter->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 2);

$money = Money::of(5000, 'USD');
echo (new MoneyNumberFormatter($formatter))->format($money); // US$5·000.00

  $integerAmount = $money->getMinorAmount()->toInt();
  

  Money::ofMinor($integerAmount, $currencyCode);
  

  $decimalAmount = $money->getAmount()->toString();
  

  Money::of($decimalAmount, $currencyCode);
  

  $currencyCode = $money->getCurrency()->getCurrencyCode();
  

  $numericCode = $money->getCurrency()->getNumericCode();
  

  class Entity
  {
      private int $price;
      private string $currencyCode;

      public function getPrice() : Money
      {
          return Money::ofMinor($this->price, $this->currencyCode);
      }

      public function setPrice(Money $price) : void
      {
          $this->price = $price->getMinorAmount()->toInt();
          $this->currencyCode = $price->getCurrency()->getCurrencyCode();
      }
  }