Подтвердить что ты не робот

Получить символ валюты в 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?

4b9b3361

Ответ 1

Я достиг этого с помощью https://github.com/symfony/Intl:

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

возвращает

'€'.

Ответ 2

Прежде всего, нет международной таблицы символов в мире, которую любой читатель мог прочитать и понять.

В каждом регионе/стране символы валюты будут отличаться, поэтому вы должны определить их на основе того, кто читает, используя язык браузера/пользователя.

Правильный путь, как вы догадались, используя 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;

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

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

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

Ответ 3

Поскольку символы могут быть многобайтовыми, я использовал функции 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);

Ответ 4

Если вы установили языковой стандарт, используя эту функцию setlocale("LC_ALL", "es_AR"); Вы можете использовать localeconv()['currency_symbol'] или localeconv()['int_curr_symbol'], чтобы получить символ валюты локали и международный вариант символа валюты.

Ответ 5

Cryptic имеет хороший ответ, но есть более простой способ сделать это:

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

Это хорошее простое встроенное решение, которое не требует объявления другой функции, однако оно также неправильно обрабатывает все случаи - то есть валюты, где буквы являются частью вывода. Но для различения, например, $и £, он отлично работает.

Ответ 6

Zend_Locale::getTranslationList('CurrencySymbol')

Предоставляет вам ассоциативный массив из трех буквенных кодов валют для их символа.

Можно использовать так:

$curArr = Zend_Locale::getTranslationList('CurrencySymbol');
echo $curArr['GBP'];

Ответ 7

Попробуйте этот вариант:

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