chippyash/currency

支持区域感知货币

5.0.2 2020-10-19 05:25 UTC

This package is auto-updated.

Last update: 2024-09-19 14:08:17 UTC


README

质量保证

PHP 7 Build Status Maintainability Test Coverage

请注意

  • PHP 5.3/5.4版本的开发者支持自版本3开始已撤回。
  • PHP 5.5版本的开发者支持自版本4开始已撤回。
  • PHP <7.2版本的开发者支持自版本5开始已撤回。

请参阅测试合同

是什么?

提供ISO-4217当前货币的强类型实现。包括

  • 货币工厂
  • 开发工具,用于创建(硬)货币类。
  • 对区域的认识

使用公开可用的货币定义。

该库在GNU GPL V3或更高版本许可下发布

为什么?

处理货币很痛苦。要正确处理,你必须翻阅大量有关区域、符号和语言名称的内容,而实际上你只是想简单地定义一种货币。这个库旨在消除一大堆复杂性。

你可以简单地使用提供的工厂方法创建货币对象,或者如果你知道你只处理一些选择的货币,可以使用实用程序将“硬”货币生成到你的项目命名空间中。

何时

该库是为支持一个“简单会计”(双重记账)库而开发的。

  • 本地PHP整数货币
  • 创建货币的工厂
  • 创建应用程序的“硬”(即具体)货币类的实用程序,因为工厂方法使用20k行的XML货币定义文件,可能对您的要求太慢。
  • 从公开数据源生成货币定义文件的实用程序。

如果您需要更多功能,请提出建议,或者最好分叉它并提供拉取请求。如果您想帮忙,需要将data/symbols.html文件重构为XML文件,并添加缺失的符号定义。以docs/missing-symbols.md为起点。大部分缺失信息可在维基百科上找到,但转录是一个手动任务。

查看ZF4软件包获取更多软件包

如何

编码基础

通过类型工厂创建货币(在当前默认区域)

    use Chippyash\Currency\Factory;
    
    $gbp = Factory::create('GBP');
    //or with an initial value
    $gbp = Factory::create('GBP', 12.26);

为不同的区域创建货币

    use Chippyash\Currency\Factory;

    Factory::setLocale('fr_FR');
    $euro = Factory::create('EUR');
    //or with an initial value
    $euro = Factory::create('EUR', 12.26);

直接创建货币

    use Chippyash\Currency\Currency;
    
    $value = 12.26;
    $code = 'FOO';
    $symbol = 'f';
    $foo = new Currency($value, $code, $symbol);
    
    //set the precision - and this is where using the Factory starts to 
    // win out unless of course you are creating fantasy currencies
    $precision = 3; //default precision == 2
    $foo = new Currency($value, $code, $symbol, $precision);
    //set long name
    $name = 'Extra Terrestial FooBar'; //default name is the code
    $foo = new Currency($value, $code, $symbol, $precision, $name);
    //supply a display format wrapper
    $displayFormat = 'Yak Yak %s'; //default wrapper is '%s'
    $foo = new Currency($value, $code, $symbol, $precision, $name, $displayFormat);

以所有方式创建的货币都作为整数。还提供了一个额外的方法

  • display()

display()返回按为货币设置的区域的格式化货币值,例如创建

    Factory::setLocale('en_GB');
    $gbp = Factory::create('GBP', 1200.26);
    echo $gbp->display();

将显示

£1,200.26

    Factory::setLocale('fr_FR');
    $gbp = Factory::create('GBP', 1200.26);
    echo $gbp->display();

将显示

1 200,26 £

在这两种情况下,$gbp->getValue()将返回120026,即一个整数。

如果您需要根据其精度降级的值作为浮点数,请使用getAsFloat()

如前所述,货币类基于整数。这是因为整数数学比浮点数学更精确。该类知道如何使用精度参数在int/float之间进行转换,因此可以保持长期精度。

您可以通过set()方法使用整数值或通过setAsFloat()方法使用浮点值来设置其值,该浮点值将使用货币的精度值提升为内部整数值。例如,假设精度 == 2,则

    $curr->set(2000);
    //is same as 
    $curr->setAsFloat(20.00);

请注意,魔法 __toString() 方法将返回字符串化的整数值。请使用display()方法进行区域感知的货币显示。

生成您自己的应用程序硬货币

假设您的应用程序只对使用澳元(AUD)、英镑(GBP)和美元(USD)感兴趣。从处理的角度来看,不断地查询currencies.xml文件,尽管它已优化,但仍然很大,可能是一个昂贵的进程。

提供了一个实用程序,使您能够将'硬'货币类生成到磁盘。您需要通过Composer以开发要求(Composer的默认设置)安装库。实用程序位于bin/generate-currency-class.php。

参数(按使用顺序)是

  • code:ISO4217货币代码
  • namespace:您的应用程序命名空间。使用双斜杠转义'\',即'\\'
  • destDir:要写入代码的目标目录。
  • locale:[可选] 如果未指定,则使用您的当前区域设置(locale_get_default)。

假设我们的当前区域设置是我们需要的,然后我们可以运行程序3次来生成类

bin/generate-currency-class.php aud MyApp\\Currency /home/foo/Projects/MyApp/Currency
bin/generate-currency-class.php gbp MyApp\\Currency /home/foo/Projects/MyApp/Currency
bin/generate-currency-class.php usd MyApp\\Currency /home/foo/Projects/MyApp/Currency

假设我们还想在法国显示这些货币。我们可以生成如下

bin/generate-currency-class.php aud MyApp\\Currency\\Fr /home/foo/Projects/MyApp/Currency/Fr fr_FR
bin/generate-currency-class.php gbp MyApp\\Currency\\Fr /home/foo/Projects/MyApp/Currency/Fr fr_FR
bin/generate-currency-class.php usd MyApp\\Currency\\Fr /home/foo/Projects/MyApp/Currency/Fr fr_FR

在任何情况下,您将在目标目录中找到三个已生成的类

  • AUD.php
  • GBP.php
  • USD.php

更改库

  1. 分叉它
  2. 编写测试
  3. 修改它
  4. 发起拉取请求

发现了一个您无法解决的错误吗?

  1. 分叉它
  2. 编写测试
  3. 发起拉取请求

NB。在您的拉取请求之前,请确保将您的工作分支重新基到HEAD

或者 - 提出一个问题票据。

修改货币数据集

如前所述,我们在数据集中缺少一些符号数据(请参阅docs/missing-symbols.md)。如果您更新了data/目录中的任何文件,您需要运行bin/create-currency-data.php脚本来重新生成src/Chippyash/Currency/currencies.xml文件。

然后运行src/Chippyash/Currency/currency-type-xsd.xsl翻译与生成的currencies.xml文件相对,以创建src/Chippyash/Currency/currency-type.xsd。

在发起任何更改数据集的拉取请求之前运行这些。

请注意,CLDR不提供一些货币名称的小部分区域设置。Currency\Factory将默认使用可以找到的基础语言翻译,或者作为后备使用英语名称。

如果找不到货币的符号,它将默认使用ISO4217代码作为符号。

数据集来源

数据集来自多个地方

  • ISO4217.xml NB - 重命名下载的文件
  • symbols.html NB - 从页面抓取。如果您知道更好的来源,请告诉我。
  • cldr目录。是最新CLDR数据集的主目录最新

在哪里?

库托管在Github。它在Packagist.org上可用。

安装

安装Composer

生产环境

    "chippyash/currency": ">=4,<5"

开发环境

克隆此仓库,然后在本地仓库根目录下运行Composer以拉取依赖项

    git clone git@github.com:chippyash/Currency.git Currency
    cd Currency
    composer install

运行测试

    cd Currency
    vendor/bin/phpunit -c test/phpunit.xml test/

许可证

本软件库在BSD 3-Clause许可证下发布

本软件库版权所有(c)2015,Ashley Kitson,英国

历史

V1.0.0 初始发布

V2.0.0 BC Break:命名空间从chippyash\Currency更改为Chippyash\Currency

V2.0.1 更新开发依赖项

V2.0.2 从coveralls切换到codeclimate

V2.0.3 添加到包的链接

V2.0.4 修复徽章链接

V2.0.5 验证PHP 7兼容性

V2.0.6 依赖项更新

V3.1.0 添加currency-type.xsd创建功能

V3.0.0 退出对PHP 5.3和5.4的支持

V3.0.1 更新composer - 由于packagist composer.json格式变更而强制执行

V4.0.0 BC Break。撤销对旧PHP版本的支持

V4.0.1 修复与本地get_locale相关的命名空间问题

V4.1.0 获取货币精度的能力

V4.2.0 许可证从GPL V3更改为BSD 3-Clause

V5.0.0 移除对chippyash/strongtype的依赖。BC break。移除对PHP <7.2的支持