Ответ 1
Я достиг этого с помощью https://github.com/symfony/Intl:
Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
возвращает
'€'.
Начнем с простой части кода для форматирования денег с помощью 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?
Я достиг этого с помощью https://github.com/symfony/Intl:
Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
возвращает
'€'.
Прежде всего, нет международной таблицы символов в мире, которую любой читатель мог прочитать и понять.
В каждом регионе/стране символы валюты будут отличаться, поэтому вы должны определить их на основе того, кто читает, используя язык браузера/пользователя.
Правильный путь, как вы догадались, используя NumberFormatter:: CURRENCY_SYMBOL, но сначала вам нужно установить соответствующий язык, например ru-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;
Таким образом, символ будет понятен пользователю.
Например, символ $будет:
Поскольку символы могут быть многобайтовыми, я использовал функции 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);