2010-05-25 15 views
4

J'essaie de créer une version française de l'un de mes sites. J'ai mis setlocale(LC_ALL, 'fr_FR'); en haut de ma page, et en utilisant strftime J'affiche les dates correctement dans le style français.setlocale à fr-FR en PHP et mise en forme des nombres

Cependant, j'ai quelques problèmes avec un nombre. Une partie de la page utilise les données que je reçois d'un service Web. J'assigne une valeur retournée à un var comme ceci:

$overallRating = $returnArray['Overall']; 

Je suis puis en utilisant le code suivant plus tard pour le formater à 1 place décimale

number_format($overallRating,1) 

Dans la version anglaise de la valeur overallRating pourrait être 7.5 et retourne une valeur telle que 7.5 (la raison de l'exécuter par la number_format est si elle retourne 7 je veux afficher 7.0)

Cependant, dans la version française si je p rint la valeur $ globaleRating brute je reçois 7,5 qui semble l'avoir traduit en français. Ce serait bien, mais si je le lance à travers number_format j'obtiens l'erreur:

Notice: A non well formed numeric value encountered in /sites/index.php on line 250 

ligne 250 est la number_format ligne

Je suppose que la traduction 7,5 salit vers le haut, mais pas sûr de savoir comment résoudre ce ...

en utilisant PHP 5.3 dans le cas où il y a quelque chose de nouveau qui me aide

+0

Cela ressemble à votre valeur obtient number_formatted ailleurs. Êtes-vous sûr à 100% que cela n'arrive pas? Pouvez-vous suivre étape par étape à quel point la valeur est convertie? –

+0

Bien que je ne sois pas number_formating le nombre avant cela, je pense que le 'setlocale' le traduit, comme je l'ai dit dans la question si j'imprime le $ overallRating dans la page française avant de l'exécuter nombre_format il montre 7,5 (avec une virgule). Je suppose que cela provoque l'échec de number_format? –

Répondre

6

donc finalement trouvé la réponse après beaucoup de recherches.

PHP ne fonctionne vraiment qu'avec les séparateurs décimaux standard américains et ne peut pas fonctionner avec le séparateur français.

La réponse, bien que non parfaite, est de réinitialiser les valeurs numériques pour utiliser US tout en permettant le formatage des dates en français. Placer cette ligne:

setlocale(LC_NUMERIC, 'C'); 

Sous

setlocale(LC_ALL, 'fr_FR'); 

a fait le tour

1

est-ce que vous demandez?

<?php 
    $overallRating = number_format($number, 1, '.', ''); 
?>

plus tard Edit:

<?php 
setlocale(LC_ALL, 'fr_FR'); 
$number = '7'; 
echo $overallRating = number_format($number, 1, '.', ''); 
?>
+0

Non, c'est l'erreur qu'il lance qui cause le problème –

+0

Je viens de courir le code ci-dessus et fonctionne bien pour moi ... –

+0

Essayez de mettre un nombre décimal dans le nombre, cela semble être le problème. soit 7,5 au lieu de 7 –

1

Je voulais prendre une chaîne française éditée comme « 54,33 » et enregistrez-le revenir à la db comme En_US nombre car, comme cela a été souligné, PHP n'aime vraiment que les nombres au format en_US. Je n'ai pas vu de fonctions de conversion PHP intégrées donc construit pour faire le travail. Supprime le séparateur de milliers et remplace le séparateur décimal par "." et il est conçu pour fonctionner avec n'importe quelle configuration.

//Currency Conversion Back to US for DB Storage or PHP number formatting 
function number_convert_us($num) { 
    $locale_settings = localeconv(); 
    $num = str_replace($locale_settings['mon_thousands_sep'], "", trim($num)); 
    $num = str_replace($locale_settings['mon_decimal_point'], ".", $num); 
    return number_format((double)$num, 2, '.', ''); 
} 

Je vais construire une chose similaire pour JavaScript.Trouvé cette bibliothèque pour l'affichage: http://software.dzhuvinov.com/jsworld-currency-formatting.html