eoneopay / currency
Requires
- php: >=7.1
Requires (Dev)
- eoneopay/standards: dev-master
- phpmd/phpmd: ^2.6
- phpstan/phpstan: ^0.9
- phpunit/phpunit: ^7.0
- roave/security-advisories: dev-master
- sebastian/phpcpd: ^4.0
- squizlabs/php_codesniffer: 3.*
This package is not auto-updated.
Last update: 2019-02-20 19:21:34 UTC
README
此库允许通过 ISO4217 代码或数字标识符查找货币,并根据不同的区域格式化显示。
此库主要包括三个部分:货币、区域和翻译器。
货币
货币是由以下简单文件组成的
属性 | 描述 |
---|---|
小数单位 | 货币使用的小数位数,例如澳大利亚元为 2 |
名称 | 货币名称,例如澳大利亚元 |
数字代码 | ISO4217 数字代码,例如澳大利亚元为 036 |
符号 | UTF-8 货币符号,例如 $ |
货币类名是 PSR-2 格式的 ISO4217 阿拉伯字母代码,例如澳大利亚元为 Aud
。
查找货币
您可以使用 ISO4217
类查找货币。此类提供两种方法
方法 | 描述 |
---|---|
find($code): CurrencyInterface |
通过字母*或数字代码查找货币 |
getSupportedAlphaCodes(): array |
获取支持的字母代码列表 |
* 字母代码不区分大小写
注意:并非所有货币都得到支持,更多货币将尽快添加,您可以打开一个 pull request 添加您需要的货币。
使用货币
如果成功找到货币,您将收到一个带有以下方法的钱币对象
方法 | 描述 |
---|---|
getAlphaCode(): string |
获取货币的字母代码 |
getMinorUnit(): int |
获取货币使用的小数位数 |
getName(): string |
获取货币的全称 |
getNumericCode(): string |
获取货币的 ISO4217 数字代码 |
getCurrencySymbol(): string |
获取货币的 UTF-8 符号 |
区域
区域也是由以下简单文件组成的
属性 | 描述 |
---|---|
标识符 | 区域的 IETF 语言标签,例如澳大利亚英语为 en-AU |
货币格式 | 使用符号替换来格式化货币的方法,例如澳大利亚英语为 '-¤ #' |
小数分隔符 | 在数字显示中如何表示小数,例如澳大利亚英语为点 |
负号 | 此区域使用的负号,例如澳大利亚英语为连字符 |
数字格式 | 使用符号替换来格式化数字值的方法,例如澳大利亚英语为 '-#' |
千位分隔符 | 用于将千位组合在一起的分隔符,例如澳大利亚英语为逗号 |
为什么不使用 php-intl?
此代码似乎与php-intl提供的功能重复,使用了NumberFormatter类,但是此扩展在不同的操作系统和区域设置上工作方式不同,导致格式化数字和货币不一致。《a href="https://symfony.ac.cn/doc/current/components/intl.html" rel="nofollow noindex noopener external">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格式,阿拉伯语可能无法正确显示。