eoneopay/currencies

此包已废弃且不再维护。作者建议使用 eonx-com/currencies 包。

处理货币的ISO 4217兼容库

v1.0.0 2018-11-29 04:31 UTC

This package is auto-updated.

Last update: 2019-11-09 03:56:17 UTC


README

此库允许通过ISO4217代码或数字标识符查找货币,并基于不同地区格式化显示。

此库包含三个主要部分:货币、地区和翻译器。

货币

货币是由以下属性组成的简单文件:

属性 描述
小数单位 货币使用的小数位数,例如澳大利亚元为2位
名称 货币名称,例如澳大利亚元
数字代码 ISO4217数字代码,例如澳大利亚元的036
符号 UTF-8货币符号,例如$

货币类名是PSR-2格式的ISO4217字母代码,例如澳大利亚元的代码为Aud

查找货币

您可以使用ISO4217类查找货币。此类提供了两种方法

方法 描述
find($code): CurrencyInterface 通过字母*或数字代码查找货币
getSupportedAlphaCodes(): array 获取支持的字母代码列表

* 字母代码不区分大小写

注意:目前并非所有货币都受到支持,将尽快添加更多货币,您可以选择提交拉取请求以添加您需要的货币。

与货币一起工作

如果成功找到货币,您将接收到一个包含以下方法的货币对象:

方法 描述
getAlphaCode(): string 获取货币的字母代码
getMinorUnit(): int 获取货币使用的小数位数
getName(): string 获取货币的完整名称
getNumericCode(): string 获取货币的ISO4217数字代码
getCurrencySymbol(): string 获取货币的UTF-8符号

地区

地区也是由以下属性组成的简单文件:

属性 描述
标识符 地区的IETF语言标签,例如澳大利亚英语的en-AU
货币格式 使用符号替换来格式化货币,例如澳大利亚英语的'-¤ #'
小数分隔符 在数字显示中如何表示小数,例如澳大利亚英语的句号
负号 此地区使用的负号,例如澳大利亚英语的连字符
数字格式 使用符号替换来格式化数值,例如澳大利亚英语的'-#'
千位分隔符 用于将千位分组分隔的符号,例如澳大利亚英语的逗号

为什么不使用php-intl?

此代码似乎重复了 php-intl 通过 NumberFormatter 类 提供的功能,然而此扩展在不同的操作系统和区域设置中工作方式不同,导致格式化的数字和货币不一致。 symfony/intl 包仅提供对 en-US 的支持,如果已安装则回退到 php-intl,这会导致同样的问题。

此库在格式化数字或货币以供显示时,提供了所有操作系统中的一致性,而不管 php-intl 如何。

查找区域设置

您可以使用 Translator 类来查找货币。此类提供两种方法:

方法 描述
find($code): LocaleInterface 通过 IETF 语言代码查找区域
getSupportedLocales(): 数组 获取支持的 IETF 语言代码列表

* IETF 不区分大小写,并忽略特殊字符:en-au、en_AU、enAu 和 en((au 都可以正确解析

注意:并非所有区域设置都得到支持,将尽快添加更多区域设置。您还可以打开一个拉取请求,添加所需的区域设置。

使用区域设置

如果成功找到区域设置,您将返回一个包含以下方法的区域对象:

方法 描述
getIdentifier(): 字符串 获取当前区域的 IETF 语言代码

格式化

此类的实际用途是根据区域设置格式化数字和货币,这是通过 Formatter 类实现的,该类提供四种方法:

方法 描述
currency(string $locale): 字符串 使用基于 IETF 区域语言代码显示的货币的精度和符号来获取金额的格式化
decimal(): 字符串 使用货币的精度来获取金额的格式化,例如,澳大利亚元的两位小数
numeric(string $locale): 字符串 使用基于 IETF 区域语言代码显示的货币的精度来获取金额的格式化

在实例化格式化器时,必须将金额和 ISO4217 alpha 或 numeric 代码传递给构造函数。

/**
 * Format a currency based on locale
 */

// Create formatter based on bitcoin with negative value
$formatter = new \EoneoPay\Currencies\Formatter('-1.051', 'xbt');

// Australia
echo $formatter->currency('en-AU'); // -฿1,601.05100000

// China
echo $formatter->currency('zh-CN'); // -฿ 1601.05100000

// France
echo $formatter->currency('fr-FR'); // -1 601,05100000 ฿

// Netherlands
echo $formatter->currency('nl-NL'); // ฿ -1.601,05100000

// Oman
echo $formatter->currency('ar-OM'); // ؜฿ ؜-١٬٦٠١٫٠٥١٠٠٠٠٠

/**
 * Format a number based on locale
 */
 
// Create formatter based on bitcoin with positive value
$formatter = new \EoneoPay\Currencies\Formatter('1.051', 'xbt');

// Australia
echo $formatter->numeric('en-AU'); // 1,601.05100000

// China
echo $formatter->numeric('zh-CN'); // 1601.05100000

// France
echo $formatter->numeric('fr-FR'); // 1 601,05100000

// Netherlands
echo $formatter->numeric('nl-NL'); // 1.601,05100000

// Oman
echo $formatter->numeric('ar-OM'); // ؜١٬٦٠١٫٠٥١٠٠٠٠٠

注意:由于输出为 RTL 格式化,阿拉伯语可能无法正确显示。