grahamsutton / moneyman

此包最新版本(v0.1)没有可用的许可信息。

MoneyMan 是一种在您的应用中以对象的形式表示货币的方法。

v0.1 2017-03-04 19:58 UTC

This package is not auto-updated.

Last update: 2024-09-28 19:36:41 UTC


README

Build Status Code Coverage Scrutinizer Code Quality

MoneyMan 是一种在您的应用中以对象的形式表示货币的方法。

使用浮点数可能会有麻烦,并可能导致许多让您害怕在应用中进行货币兑换的头痛问题。MoneyMan 通过以下方式力求使处理货币变得简单:

  • 不可变货币对象,可防止货币值突然变成其他东西。
  • 基于整数的货币值,可保护您的应用免受舍入误差的影响。
  • 货币兑换,将货币对象转换为所需货币
  • 可互换的货币兑换服务,使用 Google、Yahoo 或 Fixer(由 Swap 库支持)
  • 格式化货币对象值的显示,以便在所需区域显示
  • 可以将不同货币的货币对象相加并得到所需货币的输出

目前支持的汇率服务包括

安装

使用命令行

$ composer require grahamsutton/moneyman

快速示例

创建货币对象并根据区域打印其值

use MoneyMan\Money;
use MoneyMan\Currency;

$money = new Money(123400, new Currency('USD'));

// Get human readable value based on locale , default is 'en_US'
echo $money->getFormatted();  // "$1,234.00"

// Get human readable value based on specified locale
echo $money->getFormatted('de_DE');  // "1.234,00 $"

获取用于获取汇率的 Swap 对象

use MoneyMan\Exchange;
use MoneyMan\ServiceFactory;

// Available services
$yahoo_service = ServiceFactory::getService('yahoo');
$fixer_service = ServiceFactory::getService('fixer');

// Pass to a \MoneyMan\Exchange object
$exchange = new Exchange($fixer_service);

将货币对象从一种货币兑换到另一种货币

use MoneyMan\Money;
use MoneyMan\Currency;
use MoneyMan\Exchange;
use MoneyMan\ServiceFactory;

$service = ServiceFactory::getService('fixer');  // use Fixer.io
$exchange = new Exchange($service);

$money = new Money(5000, new Currency('USD'));

// Pretend USD->EUR exchange rate is 0.92142
$exchanged_money = $exchange->exchange($money, new Currency('EUR'));

// Print the new money object value
echo $exchanged_money->getFormatted();  // "€46.07"

// Print it in different locale
echo $exchanged_money->getFormatted('de_DE');  // "46,07 €"

进行算术运算

添加相同货币的两个货币对象

use MoneyMan\Money;
use MoneyMan\Currency;

$money1 = new Money(12300, new Currency('USD'));
$money2 = new Money(4500, new Currency('USD'));

// Returns a brand new Money object
$new_money = $money1->add($money2);

// Get human readable value of the new Money object
echo $new_money->getFormatted();  // "$168.00"

减去相同货币的两个货币对象

use MoneyMan\Money;
use MoneyMan\Currency;

$money1 = new Money(12300, new Currency('USD'));
$money2 = new Money(4500, new Currency('USD'));

// Returns a brand new Money object
$new_money = $money1->subtract($money2);  // think $money1 - $money2

// Get human readable value of the new Money object
echo $new_money->getFormatted();  // "$78.00"

添加不同货币的两个货币对象

use MoneyMan\Money;
use MoneyMan\Currency;
use MoneyMan\Exchange;
use MoneyMan\ServiceFactory;

// Get a service that will be used to perform the exchange
$service  = ServiceFactory::getService('yahoo');  // will use Yahoo Finance
$exchange = new Exchange($service);

$money1 = new Money(4300, new Currency('USD'));
$money2 = new Money(6700, new Currency('EUR'));

// $money2 will be converted to $money1's currency and then added together.
// Pretend EUR->USD exchange rate is 1.09124
$exchanged_money = $exchange->add($money1, $money2);

// Print the new money object's value
echo $exchanged_money->getFormatted();  // "$116.11"

// Print the new money object in different locale
echo $exchanged_money->getFormatted('de_DE');  // "116,11 $"

减去不同货币的两个货币对象

...

$money1 = new Money(10000, new Currency('EUR'));
$money2 = new Money(5300, new Currency('USD'));

// $money2 will be converted to $money1's currency and then subtracted from $money1
// Pretend USD->EUR exchange rate is 0.94235
$exchanged_money = $exchange->subtract($money1, $money2);  // think $money1 - $money2

// Print the new money object's value
echo $exchanged_money->getFormatted();  // "€50.05"

// Print the new money object in different locale
echo $exchanged_money->getFormatted('de_DE');  // "50,05 €"

为什么使用不可变货币对象?

一开始可能不太理解,但当你深入思考时,它确实如此。想象你有一张 20 美元的纸币。20 美元的纸币会突然变成 35 美元吗?显然,不会。你必须给它加上 15 美元才能得到一个新的单值,你不能改变 20 美元纸币的值。

MoneyMan 中的货币对象意图采用更“自然”的世界方法。在示例中,20 美元的纸币代表一个货币的单个值(第一个 Money 对象)。当我们给它加上 15 美元时,我们是在添加第二个、独立的货币值(第二个 Money 对象)。从我们得到新的、结合总值的单个值(一个新、第三个 Money 对象)。

MIT 许可证

MIT 许可证

版权所有 (c) 2017 Graham Sutton

特此授予任何人免费获得此软件及其相关文档副本(“软件”)的副本的权利,不受限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向提供软件的个人提供进行此类操作的权利,但需遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类索赔、损害或其他责任是基于合同、侵权或其他方式产生的,无论是否与软件或软件的使用或其他方式有关。