2017-06-26 2 views
2

Je travaille actuellement avec une API où au lieu des flottants ou des nombres entiers pour la devise je reçois des chaînes comme celles-ci.Obtenir le code de devise basé sur le symbole

  • $ 2,49
  • £ 2,49
  • € 2,49
  • etc.

Le problème avec ce que je dois conserver séparément la valeur et de la monnaie, mais la monnaie doit être stocké comme code ISO, par exemple EUR, USD ou GBP au lieu de € et $.

Yat-il un moyen en PHP pour obtenir le code de devise basé sur un symbole monétaire en utilisant le NumberFormatter ou quelque chose comme ça?

Actuellement, j'ai juste une très longue liste de symboles monétaires et de noms que j'utilise pour faire des choses comme string_contains('$2.49', '$') pour vérifier une certaine monnaie.

+6

Il n'y a pas de solution générale car plusieurs devises utilisent le même symbole. Par exemple. AUD, NZD, USD, ... utilisent tous le symbole du dollar. – Richard

+0

@GauravDave - Cela fait le contraire de ce que la question demande. – Quentin

Répondre

6

Vous pouvez travailler avec NumberFormatter::parseCurrency:

<?php 
$fmt = new NumberFormatter('en_US', NumberFormatter::CURRENCY); 

echo "#1: ".$fmt->parseCurrency("$2.49", $curr)." in $curr<br>"; 
echo "#2: ".$fmt->parseCurrency("£2.49", $curr)." in $curr<br>"; 
echo "#3: ".$fmt->parseCurrency("€2.49", $curr)." in $curr<br>"; 
?> 

Prints:

#1: 2.49 in USD 
#2: 2.49 in GBP 
#3: 2.49 in EUR 

Notez que le commentaire de Richard à propos de plusieurs devises en utilisant le même symbole est toujours valable, mais peut être traitée en spécifiant différents endroits pour la NumberFormatter :

<?php 
$fmt = new NumberFormatter('en_AU', NumberFormatter::CURRENCY); 

echo "#1: ".$fmt->parseCurrency("$2.49", $curr)." in $curr<br>"; 
?> 

Serait-il par exemple changez la première sortie en:

#1: 2.49 in AUD 
+2

Je risque fort de deviner que le changement de 'en_US' en un autre code de pays peut entraîner l'interprétation de' $ 'comme une devise différente selon les paramètres régionaux. –

+0

Oui, confirmé. – Marvin