web-dev-qa-db-fra.com

Obtenir le symbole monétaire dans PHP

Commençons par un simple morceau de code pour formater de l'argent avec NumberFormatter:

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(123456789, 'JPY');

Cela imprime: ¥123,456,789.

C'est ok si vous voulez formater de l'argent.

Mais ce que je veux faire est d’obtenir le symbole monétaire (par exemple ¥) pour un code monétaire ISO 4217 donné (par exemple JPY).

Ma première hypothèse était d'essayer d'utiliser:

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

Mais cela donne le symbole monétaire pour les paramètres régionaux donné dans constructeur (en_US), $ dans mon cas.

Existe-t-il un moyen d'obtenir le symbole monétaire par code monétaire ISO 4217 en PHP?

36
umpirsky

J'ai réalisé ceci en utilisant https://github.com/symfony/Intl :

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

résultats

'€'.
11
umpirsky

Tout d’abord, il n’existe pas de tableau international des symboles monétaires mondiaux, que tout le monde sur la planète puisse lire et comprendre.

Dans chaque région/pays, les symboles monétaires seront différents, c’est pourquoi vous devez les déterminer en fonction de la personne qui lit, en utilisant les paramètres régionaux du navigateur/de l’utilisateur.

La manière correcte est comme vous l'avez deviné, utilisez NumberFormatter :: CURRENCY_SYMBOL, mais vous devez d'abord définir les paramètres régionaux appropriés, comme 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;

De cette façon, le symbole sera compréhensible par l'utilisateur.

Par exemple, $ symbol sera:

  • Dollar canadien (CAD): CA $ aux États-Unis,CADen Roumanie, $ CA en Iran
  • Iran Rial (IRR):IRRaux Etats-Unis, alors qu'en Iran sera
33
idragosalex

Puisque les symboles peuvent être multi-octets, j'ai utilisé les fonctions mb _ * () pour saisir correctement les caractères sans ponctuation et sans chiffre qui ne feraient que laisser le symbole.

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);
3
cryptic ツ

Si vous définissez les paramètres régionaux à l'aide de cette fonction setlocale("LC_ALL", "es_AR");Vous pouvez utiliser localeconv()['currency_symbol'] ou localeconv()['int_curr_symbol'] pour obtenir le symbole monétaire des paramètres régionaux et la variante internationale du symbole monétaire. 

Zend_Locale::getTranslationList('CurrencySymbol')

Vous donnera un tableau associatif de codes de devise de 3 lettres à leur symbole.

Peut alors utiliser comme ceci:

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

Cryptic a une bonne réponse, mais il existe un moyen plus simple de le faire:

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

Il s’agit d’une solution simple et en ligne de Nice qui ne nécessite pas la déclaration d’une autre fonction, mais qui ne gère pas non plus correctement tous les cas - c’est-à-dire les devises dans lesquelles les lettres font partie de la sortie. Mais pour distinguer entre par exemple $ et £, ça marche bien.

0
Benubird