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?
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 ﷼
I achieved this using https://github.com/symfony/Intl:
Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
returns
'€'.
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.
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);
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.
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'];
Try this variant:
$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL);
来源:https://stackoverflow.com/questions/13897516/get-currency-symbol-in-php