在 PHP 中获取货币符号

问题描述 投票:0回答:9

让我们从一段简单的代码开始,用

NumberFormatter
来格式化货币:

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(123456789, 'JPY');

打印:

¥123,456,789

如果您想格式化货币,这没问题。

但我想做的是获取给定货币 ISO 4217 代码(例如 JPY)的货币符号(例如 ¥)。

我的第一个猜测是尝试使用:

$formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL);

但这给出了构造函数(en_US)中给出的区域设置的货币符号,在我的例子中为 $ 。

有没有办法在 PHP 中通过货币 ISO 4217 代码获取货币符号?

php formatting currency
9个回答
60
投票

首先,不存在地球上任何人都可以阅读和理解的国际通用货币符号表。

在每个地区/国家/地区,货币符号都会有所不同,这就是为什么您必须根据阅读者、使用浏览器/用户区域设置来确定它们。

正确的方法正如您所猜测的那样,使用 NumberFormatter::CURRENCY_SYMBOL,但您首先必须设置适当的区域设置,例如 en-US@currency=JPY:

$locale='en-US'; //browser or user locale
$currency='JPY';
$fmt = new NumberFormatter( $locale."@currency=$currency", NumberFormatter::CURRENCY );
$symbol = $fmt->getSymbol(NumberFormatter::CURRENCY_SYMBOL);
header("Content-Type: text/html; charset=UTF-8;");
echo $symbol;

这样用户就可以理解该符号。

例如,$symbol 将是:

  • 加元(CAD):CA$(美国)、CAD(罗马尼亚)、$CA(伊朗)
  • 伊朗里亚尔(IRR):在美国为IRR,而在伊朗则为

27
投票

我使用https://github.com/symfony/Intl实现了这一点:

Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')

退货

'€'.

Symfony 版本 > 4.3

值得指出的是,对于 SF4.3 及以上版本,此功能已被弃用:

/**
 * Returns the bundle containing currency information.
 *
 * @return CurrencyBundleInterface The currency resource bundle
 *
 * @deprecated since Symfony 4.3, to be removed in 5.0. Use {@see Currencies} instead.
 */
public static function getCurrencyBundle(): CurrencyBundleInterface
{

所以,你可以这样做:

use Symfony\Component\Intl\Currencies;
echo Currencies::getSymbol('AUD'); 

5
投票

由于符号可以是多字节的,所以我使用 mb_*() 函数来正确抓取所有非标点符号和非数字字符,这些字符只会留下符号。

function get_currency_symbol($string)
{
    $symbol = '';
    $length = mb_strlen($string, 'utf-8');
    for ($i = 0; $i < $length; $i++)
    {
        $char = mb_substr($string, $i, 1, 'utf-8');
        if (!ctype_digit($char) && !ctype_punct($char))
            $symbol .= $char;
    }
    return $symbol;
}

$format = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$string = $format->formatCurrency(123456789, 'JPY');
echo get_currency_symbol($string);

5
投票

如果您使用此功能设置区域设置

setlocale("LC_ALL", "es_AR");
您可以使用
localeconv()['currency_symbol']
localeconv()['int_curr_symbol']
获取区域设置货币符号和货币符号的国际变体。


1
投票

您可以使用Symfony Intl组件

使用

composer require symfony/intl

通过作曲家安装它

然后使用以下内容获取 HTML 符号

use Symfony\Component\Intl\Currencies;
\Locale::setDefault('en');
$symbol = Currencies::getSymbol('INR'); // => '₹'
echo $symbol;

1
投票

我在php中使用了这段代码和这段代码

$CS = new NumberFormatter('en_PH', NumberFormatter::CURRENCY);
$CS = $CS->getSymbol(NumberFormatter::CURRENCY_SYMBOL);

我得到了菲律宾比索的货币符号₱₱₱₱

我还尝试了菲律宾比索₱的 HTML 代码“₱”。但在 php 服务器 php 邮件中使用时它不起作用,特别是如果您使用电子邮件服务器。

试试这个代码。


0
投票

Cryptic 有一个很好的答案,但有一个更简单的方法:

preg_replace('#[a-z0-9.]*#i', '', $formatter->formatCurrency('0', $currency))

这是一个很好的简单内联解决方案,不需要声明另一个函数,但它也不能正确处理所有情况 - 即字母是输出一部分的货币。但为了区分例如美元和英镑,效果很好。


0
投票
Zend_Locale::getTranslationList('CurrencySymbol')

将为您提供 3 个字母货币代码与其符号的关联数组。

然后可以这样使用:

$curArr = Zend_Locale::getTranslationList('CurrencySymbol');
echo $curArr['GBP'];

-2
投票

尝试这个变体:

$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL);
© www.soinside.com 2019 - 2024. All rights reserved.