2010-12-07 13 views
1

Je dois stocker des nombres qui représentent des montants de devise dans 2dp pour être sortis à l'écran. Le même nombre peut être modifié avec des fonctions mathématiques après avoir été formaté. Je suis sûr que je me souviens avoir eu des erreurs dans le passé en raison du traitement du nombre formaté en nombre comme une chaîne, et le séparateur de milliers étant la cause du problème, mais le script ci-dessous s'exécute sans erreurs.Faire face à la devise dans PHP - décimales et nombre_format()

Est-ce que les types de données lâches de PHP sauvent la journée ici? Est-ce que quelque chose a changé dans une version PHP relativement récente? Si non, y a-t-il d'autres circonstances où number_format() peut encore provoquer l'échec d'une fonction mathématique parce que le nombre est une chaîne?

echo round(1111123.2, 2); //included to demonstrate how it can't be used for this purpose 
echo "<br />"; 
echo number_format(1111123.2, 2); 
echo "<br />"; 
$num = number_format(1111123.2, 2); 
echo number_format($num/42, 2); 

// output 
1111123.2 
1,111,123.20 
0.02 

Répondre

2

Le même numéro peut être modifié avec des fonctions mathématiques après avoir été mis en forme

Ne jamais faire cela. Cela risque de se terminer en larmes, par exemple lorsque vous formatez des nombres avec des séparateurs décimaux non anglais. Effectuez les opérations sur la valeur numérique brute, puis formatez immédiatement avant la sortie.

1

Ceci est dû au type de moulage automatique effectué par PHP. Pour autant que je comprenne cela, PHP sera capable de convertir des nombres en nombres dans la plupart des fonctions mathématiques génériques, mais ce n'est pas encore sûr. Les chaînes sont converties en types de variables nécessaires

0

Eh bien ... La meilleure chose est de stocker et de calculer avec des nombres « réels » (float, double ou int) et utiliser number_format() uniquement pour la représentation.
Mais si vous avez besoin de calculer les chiffres qui ont été renvoyés de number_format(), pensez à écrire une fonction comme

function unNumber_Format($str) { 
    $search = array(',', '$', '€'); 
    $replace = array('', '', ''); 

    return (double) str_replace($search, $replace, $str); 
} 

et en utilisant comme

echo number_format(unNumber_Format($num)/42, 2); 

et vous êtes très bien! ;-)

0

mieux est d'utiliser la classe de formatter Numéro:

mais il nécessite l'extension intl activé et php 5.3.0+ .. (sudo apt-get install php5-intl)

$f = NumberFormatter::create("en-US",NumberFormatter::CURRENCY); 
var_dump($f->format(1111123.2)); 
$f = NumberFormatter::create("en-US",NumberFormatter::CURRENCY); 
$f->setSymbol(NumberFormatter::CURRENCY_SYMBOL,"€"); 
var_dump($f->format(1111123.2)); 
$f = NumberFormatter::create("de_DE",NumberFormatter::CURRENCY); 
var_dump($f->formatCurrency(1111123.2,"EUR")); 
$f = NumberFormatter::create("it_IT",NumberFormatter::CURRENCY); 
var_dump($f->formatCurrency(1111123.2,"USD")); 
$f = NumberFormatter::create("sk_SK",NumberFormatter::CURRENCY); 
var_dump($f->formatCurrency(1111123.2,"USD")); 

Retours:

string(13) "$1,111,123.20" 
string(15) "€1,111,123.20" 
string(17) "1.111.123,20 €" 
string(17) "US$ 1.111.123,20" 
string(19) "1 111 123,20 US$" 

Si vos clients sont de différents pays, juste pour stocker les paramètres régionaux, et ils auront leur nombre prédéfini.