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?
J'ai réalisé ceci en utilisant https://github.com/symfony/Intl :
Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
résultats
'€'.
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:
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);
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'];
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.