2010-10-25 3 views
32

J'ai quelques valeurs de prix à afficher dans ma page.Imprimer le format de la devise en PHP

Je suis en train d'écrire une fonction qui prend le prix du flotteur et retourne le val monnaie formatée avec le code monétaire trop ..

Par exemple, fnPrice(1001.01) devrait imprimer $ 1,000.01

Répondre

95

La réponse la plus simple est number_format().

echo "$ ".number_format($value, 2); 

Si vous voulez que votre demande soit en mesure de travailler avec plusieurs devises et le formatage des paramètres régionaux Aware (1.000,00 pour certains d'entre nous Européens par exemple), il devient un peu plus complexe.

Il y a money_format() mais il ne fonctionne pas sur Windows et repose sur setlocale(), ce qui est de la foutaise à mon avis, car il nécessite l'installation de (nom arbitraire) des paquets de paramètres régionaux sur le côté serveur.

Si vous voulez internationaliser sérieusement votre application, pensez à utiliser une bibliothèque d'internationalisation complète comme Zend_Locale de Zend Framework et Zend_Currency.

+5

+1 ne connaissait pas ces problèmes avec Windows. – Sarfraz

+3

Bonne réponse, +1 pour Zend_Locale & Zend_Currency – RobertPitt

+0

Excellente réponse – MikeMurko

7

sprintf() est la fonction PHP pour toutes sortes de formatage de chaîne http://php.net/manual/en/function.sprintf.php

J'utilise cette fonction:

function formatDollars($dollars){ 
    return '$ '.sprintf('%0.2f', $dollars); 
} 
+3

cela n'ajoutera pas de virgules (séparateurs de milliers) – stillstanding

+1

Pardonner le gravedig. Vous pouvez envelopper le '$ dollars' (dans' sprintf() ') dans un' number_format() '. Cela va ajouter les virgules – Magictallguy

44

avec l'extension intl en PHP 5.3+, vous pouvez utiliser la classe NumberFormatter :

$amount = '12345.67'; 

$formatter = new NumberFormatter('en_GB', NumberFormatter::CURRENCY); 
echo 'UK: ', $formatter->formatCurrency($amount, 'EUR'), PHP_EOL; 

$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY); 
echo 'DE: ', $formatter->formatCurrency($amount, 'EUR'), PHP_EOL; 

qui imprime:

UK: €12,345.67 
DE: 12.345,67 € 
+2

+1 pour natif numberformatter – KoolKabin

+2

Il est donc important d'avoir une solution qui ne nécessite pas la conversion en un flotteur en premier. Tellement dangereux d'utiliser un flotteur avec de la monnaie. –

1

J'ai construit cette petite fonction pour formater automatiquement n'importe quoi dans un format de devise gentil.

function formatDollars($dollars) 
{ 
    return "$".number_format(sprintf('%0.2f', preg_replace("/[^0-9.]/", "", $dollars)),2); 
} 

Modifier

Il a été souligné que cela ne montre pas des valeurs négatives. Je l'ai cassé en deux lignes, donc il est plus facile d'éditer le formatage. Enveloppez-le entre parenthèses si elle est une valeur négative:

function formatDollars($dollars) 
{ 
    $formatted = "$" . number_format(sprintf('%0.2f', preg_replace("/[^0-9.]/", "", $dollars)), 2); 
    return $dollars < 0 ? "({$formatted})" : "{$formatted}"; 
} 
+0

+1 pour la fonction fantaisie! –

+1

Ceci ne retient pas les valeurs négatives – FlyingNimbus

+0

Ceci est vrai. J'ai mis à jour la fonction pour inclure le support des nombres négatifs. Merci @FlyingNimbus – DAWTSF

1

PHP a une fonction appelée money_format pour ce faire. Lisez à ce sujet here.