Начнем с простой части кода для форматирования денег с помощью 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), $ в моем случае.
Есть ли способ получить символ валюты по коду ISO 4217 в PHP?
Прежде всего, нет международной таблицы символов в мире, которую любой читатель мог прочитать и понять.
В каждом регионе / стране символы валюты будут отличаться, поэтому вы должны определить их на основе того, кто читает, используя язык браузера / пользователя.
Правильный путь, как вы догадались, используя 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;
Таким образом, пользователь сможет понять этот символ.
Например, символ $ будет:
Я достиг этого с помощью https://github.com/symfony/Intl :
Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
возвращается
'€'.
Поскольку символы могут быть многобайтовыми, я использовал функции 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);
Если вы установили локаль с помощью этой функции setlocale("LC_ALL", "es_AR");
Вы можете использовать localeconv()['currency_symbol']
или localeconv()['int_curr_symbol']
чтобы получить символ валюты локали и международный вариант символа валюты.
Cryptic имеет хороший ответ, но есть более простой способ сделать это:
preg_replace('#[a-z0-9.]*#i', '', $formatter->formatCurrency('0', $currency))
Это приятное простое встроенное решение, которое не требует объявления другой функции, однако оно также неправильно обрабатывает все случаи – то есть валюты, где буквы являются частью вывода. Но для различения, например, $ и £, он отлично работает.
Zend_Locale::getTranslationList('CurrencySymbol')
Дает вам ассоциативный массив из трех буквенных кодов валют к их символу.
Можно затем использовать вот так:
$curArr = Zend_Locale::getTranslationList('CurrencySymbol'); echo $curArr['GBP'];
Попробуйте этот вариант:
$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL);