2012-09-26 15 views
9

Ho un problema insolito che non ho idea di come risolvere.Echo un numero molto grande

Ho un file JSON, in cui è memorizzato un ID applicazione, vale a dire quanto segue:

"app_id": "363924477024846" 

ho letto il mio file JSON dal disco rigido e analizzarlo con json_decode() per usarlo nella mia applicazione. Tuttavia, a un certo punto, voglio che l'app-id venga inviato al browser. Il problema è, se echo quella variabile, è stampata come segue:

2.7110712626725E+14 

C'è un modo per impedirlo? Non ho bisogno che sia minacciato come un numero da PHP poiché non sto facendo alcun calcolo con esso - una stringa andrebbe bene. Ma dal momento che è rappresentato solo da numeri, sembra che json_decode() lo minaccia come un numero, anche se ho messo delle virgolette intorno (che dovrebbe indicare una stringa) o forse PHP fa solo un suggerimento stupido in questo caso, non lo faccio sapere ...

Qualche idea su come gestirlo?

+0

Non l'ho provato, ma cosa succede se si utilizza 'sprintf', ad es. '$ foo = sprintf ("% d ", $ bar); echo $ pippo; '? – slugonamission

+0

Ciò è dovuto al limite di un intero con segno a 32 bit. – clentfort

+0

@slugonamission: questo stamperebbe "2147483647" sullo schermo con l'app_id usato sopra. –

risposta

16

Ho avuto lo stesso problema qui: è sufficiente utilizzare phps funzione number_format, che risolve questo problema:

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

// 363924477024846 
+0

Ha funzionato! Grazie, amico :) Accetterò la tua risposta quando sarò in grado di farlo tra 9 minuti. –

+0

Prego :) – sics

1

Prova a trasmettere in una stringa

echo((string)$theNumber); 
+0

Già provato, riecheggia lo stesso risultato. –

+0

prova var_dumping i dati e aggiorna la tua domanda con essa per favore. Questo potrebbe aiutarci a risolvere –

+0

Sembra che il problema si presenti al momento in cui il valore viene decodificato dalla stringa JSON. In questo caso viene trattato come un numero intero, quindi viene troncato al valore massimo per un numero intero a 32 bit e, successivamente, il valore originale non può essere ripristinato. – octern

1

Una soluzione rapida e sporca sarebbe quello di aggiungere un po 'di carattere, all'inizio o alla fine del numero di costringere PHP di trattarlo come una stringa. Forse intstead di "363924477024846" utilizzare "z363924477024846" e quindi rimuovere la z quando è necessario utilizzarlo. Ovviamente aggiungilo prima di inviarlo.

+2

Anche quello mi è venuto in mente. Ma ciò significherebbe archiviare un file JSON "sporco". Inoltre, è molto probabile che qualcuno che crea una nuova configurazione JSON si dimenticherà di ciò in futuro. –

0

Se è possibile modificare il contenuto del file JSON, hai provato avvolgendo l'ID dell'applicazione tra virgolette, in questo modo :

"app_id": "'363924477024846'" 

come clentfort ha detto, il gioco è superiore al valore massimo per un intero a 32 bit (~ 2,1 miliardi sottoscritto)

4

sembra json_decode ha un'opzione per trattare i grandi numeri interi come stringhe.

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

Questa dovrebbe essere la risposta, i numeri interi grandi possono ancora essere arrotondati su sistemi a 32 bit. Funziona quando la risposta accettata no. – sunshinekitty

Problemi correlati