2011-11-04 8 views
1

J'ai rencontré quelques problèmes dans le numéro de décodage php json.php json décode numéro numéro

$json = '[{"num":123456789011121314},{"num":1516171819202122232425}]'; 
$number = json_decode($json); 
foreach($number as $num){ 
    echo $num->num.'<br />'; 
    //echo (int)$num->num.'<br />'; 
} 

cela se:

1.23456789011E+17 
1.5161718192E+21 

également (int) faire un rappel mal. Et comment obtenir le nombre orignal? Merci.

J'ai besoin

123456789011121314  
1516171819202122232425 
+2

Copie possible de http://stackoverflow.com/questions/2907806/handling-big-user-ids-returned-by-fql-in-php –

Répondre

3

Si vous utilisez PHP 5.4 ou version ultérieure, vous pouvez le faire:

$number = json_decode($json, true, 512, JSON_BIGINT_AS_STRING);

qui représentera les grands nombres sous forme de chaînes au lieu de ints. Si vous avez accès au code générant le fichier json, vous pouvez également encoder les numéros sous forme de chaînes.

+2

Malheureusement, cette option est PHP 5.4+. – deceze

+1

Vous avez raison, j'ai mis à jour mon poste, merci –

+0

Excellent, merci de poster ceci! – Nate

0

Utilisez un système 128 bits?

Ce deuxième nombre est plus grand que même une machine 64 bits peut contenir un nombre entier, donc il est converti en flottant. Indiquez la perte de précision et les parties de l'exposant.

Autre solution: utilisez des nombres plus petits.

Si vous devez absolument avoir ces numéros, examinez les API telles que BC-Math ou GMP.

1

Puisque la structure de json n'est pas compliquée, nous pouvons la réparer avec une simple expression régulière. L'idée est d'inclure des nombres dans des doubles quotes.

$json = '[{"num":123456789011121314},{"num":1516171819202122232425}]'; 
$sanitized = preg_replace('/:(\w*\d+)/', ':"$1"', $json); 
$number = json_decode($sanitized); 

Ceci devrait fonctionner correctement pour vous comme pour moi.

Le motif correspond à un signe deux-points suivi d'un espace optionnel suivi d'un nombre.

+1

Produire JSON invalide pour {"test": ": 3432"}. – gimpe

+0

@gimpe En effet, mais je ne pense pas que "": 3432 "' est un nombre valide. Est-ce? – gabriel14

+0

Non mais c'est une chaîne valide. En fait, je voulais avertir les gens d'utiliser cette expression régulière seulement dans des cas spécifiques où il n'y a que des nombres et vous ne pouvez pas avoir une entrée utilisateur ressemblant à ": number". Ca a presque marché pour moi :) merci. – gimpe