datailor/laravel-money
Laravel Money
7.0.1
2022-09-27 12:11 UTC
Requires
- php: ^7.3|^8.0
- ext-intl: *
- ext-json: *
- illuminate/support: ^7.0|^8.0|^9.0
- illuminate/view: ^7.0|^8.0|^9.0
- moneyphp/money: ^3.3|^4.0.3
Requires (Dev)
- graham-campbell/testbench: ^5.7
- illuminate/filesystem: ^7.0|^8.0|^9.0
- mockery/mockery: ^1.5
- phpunit/phpunit: ^8.5|^9.5.10
- spatie/phpunit-watcher: ^1.0
README
注意:该项目抽象了 MoneyPHP
⚠️ 临时分支自 cknow/laravel-money
安装
从您的终端运行以下命令
composer require datailor/laravel-money
或者在您的 composer.json 文件中添加此行到 require 部分
"datailor/laravel-money": "^7.0"
然后运行 composer update
使用方法
use Cknow\Money\Money; echo Money::USD(500); // $5.00 echo Money::USD(500, true); // $500.00 force decimals
配置
默认值在 config/money.php
中设置。将此文件复制到您的配置目录以修改值。您可以使用以下命令发布配置
php artisan vendor:publish --provider="Cknow\Money\MoneyServiceProvider"
这是已发布文件的包含内容
return [ /* |-------------------------------------------------------------------------- | Laravel money |-------------------------------------------------------------------------- */ 'locale' => config('app.locale', 'en_US'), 'defaultCurrency' => config('app.currency', 'USD'), 'defaultFormatter' => null, 'currencies' => [ 'iso' => ['RUB', 'USD', 'EUR'], // 'all' to choose all ISOCurrencies 'bitcoin' => ['XBT'], // 'all' to choose all BitcoinCurrencies 'custom' => [ 'MY1' => 2, 'MY2' => 3 ] ] ];
高级使用
有关更多信息,请参阅 MoneyPHP
use Cknow\Money\Money; Money::USD(500)->add(Money::USD(500)); // $10.00 Money::USD(500)->add(Money::USD(500), Money::USD(500)); // $15.00 Money::USD(500)->subtract(Money::USD(400)); // $1.00 Money::USD(500)->subtract(Money::USD(200), Money::USD(100)); // $2.00 Money::USD(500)->multiply(2); // $10.00 Money::USD(1000)->divide(2); // $5.00 Money::USD(830)->mod(Money::USD(300)); // $2.30 -> Money::USD(230) Money::USD(-500)->absolute(); // $5.00 Money::USD(500)->negative(); // $-5.00 Money::USD(30)->ratioOf(Money::USD(2)); // 15 Money::USD(500)->isSameCurrency(Money::USD(100)); // true Money::USD(500)->equals(Money::USD(500)); // true Money::USD(500)->greaterThan(Money::USD(100)); // true Money::USD(500)->greaterThanOrEqual(Money::USD(500)); // true Money::USD(500)->lessThan(Money::USD(1000)); // true Money::USD(500)->lessThanOrEqual(Money::USD(500)); // true Money::USD(500)->isZero(); // false Money::USD(500)->isPositive(); // true Money::USD(500)->isNegative(); // false Money::USD(500)->getMoney(); // Instance of \Money\Money Money::isValidCurrency('USD'); // true Money::isValidCurrency('FAIL'); // false Money::getISOCurrencies(); // Load ISO currencies // Aggregation Money::min(Money::USD(100), Money::USD(200), Money::USD(300)); // Money::USD(100) Money::max(Money::USD(100), Money::USD(200), Money::USD(300)); // Money::USD(300) Money::avg(Money::USD(100), Money::USD(200), Money::USD(300)); // Money::USD(200) Money::sum(Money::USD(100), Money::USD(200), Money::USD(300)); // Money::USD(600) // Formatters Money::USD(500)->format(); // $5.00 Money::USD(199)->format(null, null, \NumberFormatter::DECIMAL); // 1,99 Money::XBT(41000000)->formatByBitcoin(); // \xC9\x830.41 Money::USD(500)->formatByCurrencySymbol(); // $5.00 Money::USD(500)->formatByCurrencySymbol(true); // 5.00$ Money::USD(500)->formatByDecimal(); // 5.00 Money::USD(500)->formatByIntl(); // $5.00 Money::USD(199)->formatByIntl(null, null, \NumberFormatter::DECIMAL); // 1,99 Money::USD(500)->formatByIntlLocalizedDecimal(); // $5.00 Money::USD(199)->formatByIntlLocalizedDecimal(null, null, \NumberFormatter::DECIMAL) // 1.99 // Parsers Money::parse('$1.00'); // Money::USD(100) Money::parseByBitcoin("\xC9\x830.41"); // Money::XBT(41000000) Money::parseByDecimal('1.00', 'USD'); // Money::USD(100) Money::parseByIntl('$1.00'); // Money::USD(100) Money::parseByIntlLocalizedDecimal('1.00', 'USD'); // Money::USD(100)
创建您的格式化器
class MyFormatter implements \Money\MoneyFormatter { public function format(\Money\Money $money) { return 'My Formatter'; } } Money::USD(500)->formatByFormatter(new MyFormatter()); // My Formatter
规则
以下是所有可用验证规则及其功能的列表
currency
正在验证的字段必须是一个有效的货币。
Validator::make([ 'currency1' => 'USD', 'currency2' => 'EUR', 'currency3' => new \Money\Currency('BRL'), ], [ 'currency1' => new \Cknow\Money\Rules\Currency(), 'currency2' => new \Cknow\Money\Rules\Currency(), 'currency3' => 'currency', ]);
money
正在验证的字段必须是一个有效的金额。
Validator::make([ 'money1' => '$10.00' 'money2' => '€10.00', 'money3' => 'R$10,00', 'money4' => '$10.00' 'money5' => '€10.00', 'money6' => 'R$10,00', ], [ 'money1' => new \Cknow\Money\Rules\Money(), 'money2' => new \Cknow\Money\Rules\Money('EUR'), // forcing currency 'money3' => new \Cknow\Money\Rules\Money('BRL', 'pt_BR'), // forcing currency and locale 'money4' => 'money', 'money5' => 'money:EUR', // forcing currency 'money6' => 'money:BRL,pt_BR', // forcing currency and locale ]);
类型转换
在此阶段,类型转换可以按以下方式定义
use Cknow\Money\Casts\MoneyDecimalCast; use Cknow\Money\Casts\MoneyIntegerCast; use Cknow\Money\Casts\MoneyStringCast; protected $casts = [ // cast money as decimal using the currency defined in the package config 'money' => MoneyDecimalCast::class, // cast money as integer using the defined currency 'money' => MoneyIntegerCast::class . ':AUD', // cast money as string using the currency defined in the model attribute 'currency' 'money' => MoneyStringCast::class . ':currency', // cast money as decimal using the defined currency and forcing decimals 'money' => MoneyDecimalCast::class . ':USD,true', ];
在上面的示例中,如果模型属性 currency
是 null
,则使用包配置中定义的货币。
设置金额可以通过几种方式完成
$model->money = 10; // 10.00 USD or any other currency defined $model->money = 10.23; // 10.23 USD or any other currency defined $model->money = 'A$10'; // 10.00 AUD $model->money = '1,000.23'; // 1000.23 USD or any other currency defined $model->money = '10'; // 0.10 USD or any other currency defined $model->money = Money::EUR(10); // 10 EUR
当我们传递包含货币的模型属性时,该属性在设置金额时也会更新
$model->currency; // null $model->money = '€13'; $model->currency; // 'EUR' $model->money->getAmount(); // '1300'
辅助工具
currency() // To use default currency present in `config/money.php` currency('USD'); money(500); // To use default currency present in `config/money.php` money(500, 'USD'); // Aggregation money_min(money(100, 'USD'), money(200, 'USD'), money(300, 'USD')); // Money::USD(100) money_max(money(100, 'USD'), money(200, 'USD'), money(300, 'USD')); // Money::USD(300) money_avg(money(100, 'USD'), money(200, 'USD'), money(300, 'USD')); // Money::USD(200) money_sum(money(100, 'USD'), money(200, 'USD'), money(300, 'USD')); // Money::USD(600) // Parsers money_parse('$5.00'); // Money::USD(500) money_parse_by_bitcoin("\xC9\x830.41"); // Money::XBT(41000000) money_parse_by_decimal('1.00', 'USD'); // Money::USD(100) money_parse_by_intl('$1.00'); // Money::USD(100) money_parse_by_intl_localized_decimal('1.00', 'USD'); // Money::USD(100)
Blade 扩展
@currency() // To use default currency present in `config/money.php` @currency('USD') @money(500) // To use default currency present in `config/money.php` @money(500, 'USD') // Aggregation @money_min(@money(100, 'USD'), @money(200, 'USD'), @money(300, 'USD')) // Money::USD(100) @money_max(@money(100, 'USD'), @money(200, 'USD'), @money(300, 'USD')) // Money::USD(300) @money_avg(@money(100, 'USD'), @money(200, 'USD'), @money(300, 'USD')) // Money::USD(200) @money_sum(@money(100, 'USD'), @money(200, 'USD'), @money(300, 'USD')) // Money::USD(600) // Parsers @money_parse('$5.00') // Money::USD(500) @money_parse_by_bitcoin("\xC9\x830.41") // Money::XBT(41000000) @money_parse_by_decimal('1.00', 'USD') // Money::USD(100) @money_parse_by_intl('$1.00') // Money::USD(100) @money_parse_by_intl_localized_decimal('1.00', 'USD') // Money::USD(100)