2012-09-26 20 views
9

Ich habe ein ungewöhnliches Problem, das ich keine Ahnung habe, wie man löst.Echo eine sehr große Zahl

Ich habe eine JSON-Datei, in dem eine Anwendungs-ID gespeichert ist, nämlich die folgenden:

"app_id": "363924477024846" 

ich meine JSON-Datei von der Festplatte lesen und analysieren es mit json_decode() es in meiner Anwendung zu verwenden. Allerdings möchte ich die App-ID an den Browser gesendet haben. Das Problem ist, wenn ich diese Variable ausspreche, ist es wie folgt gedruckt:

2.7110712626725E+14 

Gibt es eine Möglichkeit, dies zu verhindern? Ich brauche es nicht als PHP-Nummer, da ich keine Berechnungen mit ihm mache - eine Zeichenfolge wäre in Ordnung. Aber da es nur durch Zahlen repräsentiert wird, scheint es, dass json_decode() es als eine Zahl bedroht, sogar wenn ich es in Anführungszeichen setze (was eine Zeichenkette anzeigen sollte) oder vielleicht macht PHP nur dumme Typhinweise in diesem Fall, tue ich nicht wissen ...

Irgendwelche Ideen, wie man damit umgeht?

+0

Ich habe es nicht getestet, aber was ist, wenn Sie 'sprintf' verwenden, z. '$ foo = sprintf ("% d ", $ bar); echo $ foo; '? – slugonamission

+0

Dies liegt an der Grenze einer 32-Bit-Ganzzahl mit Vorzeichen. – clentfort

+0

@slugonamission: Dies würde "2147483647" auf dem Bildschirm mit der oben verwendeten app_id drucken. –

Antwort

16

hatte ich das gleiche Problem hier: Einfach phps number_format Funktion zu verwenden, die dieses Problem löst:

$number = "363924477024846"; 
echo number_format($number, 0, '', ''); 

// 363924477024846 
+0

Das hat funktioniert! Danke, Mann :) Ich werde deine Antwort annehmen, wenn ich in 9 Minuten bin. –

+0

Gern geschehen :) – sics

1

versuchen, es in einem String Casting

echo((string)$theNumber); 
+0

Bereits versucht, dass es die gleiche Ausgabe echo. –

+0

versuchen Sie var_dumping die Daten und aktualisieren Sie Ihre Frage damit bitte. Das kann uns helfen –

+0

Es scheint, als ob das Problem zu dem Zeitpunkt auftritt, zu dem der Wert aus der JSON-Zeichenkette entschlüsselt wird. Das ist der Zeitpunkt, an dem es als Integer behandelt wird. Daher wird es auf den Maximalwert für eine 32-Bit-Ganzzahl gekürzt, und danach kann der ursprüngliche Wert nicht wiederhergestellt werden. – octern

1

A quick and dirty Lösung einige Zeichen am Anfang oder am Ende Ihrer Zahl wäre hinzuzufügen, PHP zu zwingen, sie als String zu behandeln. Verwenden Sie vielleicht statt "363924477024846" "z363924477024846" und entfernen Sie dann das z, wenn Sie es verwenden müssen. Hängen Sie das natürlich an, bevor Sie es senden.

+2

Das kam mir auch in den Sinn. Aber das würde bedeuten, eine "schmutzige" JSON-Datei gespeichert zu haben. Es ist auch sehr wahrscheinlich, dass jemand, der eine neue Konfig JSON erstellt, das in Zukunft vergessen wird. –

0

Wenn Sie die JSON-Dateiinhalte ändern können, haben Sie die Anwendungs-ID in Anführungszeichen versucht Einwickeln, wie so :

"app_id": "'363924477024846'" 

wie clentfort gesagt hat, Sie überschreiten den maximalen Wert für eine 32-Bit-integer (~ 2,1 Mrd. unterzeichnet)

4

Es sieht aus wie json_decode hat eine Option, große Ganzzahlen als Zeichenfolgen zu behandeln.

json_decode($json, false, 512, JSON_BIGINT_AS_STRING) 
+1

Dies sollte die Antwort sein, große ganze Zahlen können noch auf 32-Bit-Systemen gerundet werden. Dies funktioniert, wenn die angenommene Antwort nicht funktioniert. – sunshinekitty

Verwandte Themen