49

让我们从一段简单的代码开始格式化货币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 代码获取货币符号?

4

8 回答 8

55
于 2015-05-04T09:30:28.383 回答
22

我使用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'); 
于 2013-06-05T14:10:01.090 回答
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);
于 2012-12-16T01:16:57.930 回答
4

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

于 2016-05-23T20:55:15.977 回答
1

您可以使用Symfony 国际组件

通过作曲家安装它 composer require symfony/intl

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

use Symfony\Component\Intl\Currencies;
\Locale::setDefault('en');
$symbol = Currencies::getSymbol('INR'); // => '₹'
echo $symbol;
于 2020-04-18T22:09:46.247 回答
0

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

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

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

于 2014-03-14T11:02:29.877 回答
0
Zend_Locale::getTranslationList('CurrencySymbol')

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

然后可以这样使用:

$curArr = Zend_Locale::getTranslationList('CurrencySymbol');
echo $curArr['GBP'];
于 2016-03-16T02:14:44.260 回答
-3

试试这个变种:

$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL);
于 2013-02-07T07:57:22.540 回答