Получить символ валюты в PHP

Начнем с простой части кода для форматирования денег с помощью 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?

Solutions Collecting From Web of "Получить символ валюты в 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; 

Таким образом, пользователь сможет понять этот символ.

Например, символ $ будет:

  • Канадский доллар (CAD): CA $ в США, CAD в Румынии, $ CA в Иране
  • Иран Риал (IRR): IRR в США, в то время как в Иране будет

Я достиг этого с помощью 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);