Get currency symbol in PHP

2019-01-22 17:11发布

Let's start with simple piece of code to format money with NumberFormatter:

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

This prints: ¥123,456,789.

This is ok if you want to format money.

But what I want to do is to get currency symbol (e.g. ¥) for given currency ISO 4217 code (e.g. JPY).

My first guess was to try using:

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

But that gives currency symbol for locale given in constructor (en_US), $ in my case.

Is there a way to get currency symbol by currency ISO 4217 code in PHP?

7条回答
别忘想泡老子
2楼-- · 2019-01-22 17:55

Since the symbols can be multi-byte I used mb_*() functions to correctly grab the all non-punctuation and non-digit chars which would just leaves the symbol.

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);
查看更多
Viruses.
3楼-- · 2019-01-22 18:00

Cryptic has a good answer, but there is a simpler way to do it:

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

This is a nice simple inline solution that doesn't require declaring another function, however it also doesn't properly handle all cases - i.e. currencies where letters are part of the output. But for distinguishing between e.g. $ and £, it works fine.

查看更多
三岁会撩人
4楼-- · 2019-01-22 18:00
Zend_Locale::getTranslationList('CurrencySymbol')

Will give you an associative array of 3 letter currency codes to their symbol.

Can then use like this:

$curArr = Zend_Locale::getTranslationList('CurrencySymbol');
echo $curArr['GBP'];
查看更多
Fickle 薄情
5楼-- · 2019-01-22 18:02

I achieved this using https://github.com/symfony/Intl:

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

returns

'€'.
查看更多
贪生不怕死
6楼-- · 2019-01-22 18:09

First of all, there is no international global currency symbol table, that anyone on the planet could read and understand.

In each region/country the currency symbols will differ, that`s why you must determine them based on who is reading, using the browser / user locale.

The correct way is as you guessed, using NumberFormatter::CURRENCY_SYMBOL, but you first have to set the appropriate locale like 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;

This way the symbol will be understandable by the user.

For example, $symbol will be:

  • Canadian dollar (CAD) : CA$ in USA, CAD in Romania , $CA in Iran
  • Iran Rial (IRR): IRR in USA, while in Iran will be
查看更多
我命由我不由天
7楼-- · 2019-01-22 18:15

If you set the locale using this function setlocale("LC_ALL", "es_AR"); You can use localeconv()['currency_symbol'] or localeconv()['int_curr_symbol'] to get the locale currency symbol and the international variation of the currency symbol.

查看更多
登录 后发表回答