2012-09-26 23 views
9

Tengo un problema inusual que no tengo ni idea de cómo resolverlo.Echo un número muy grande

Tengo un archivo JSON, donde se almacena un ID de aplicación, a saber, la siguiente:

"app_id": "363924477024846" 

leo mi archivo JSON desde el disco duro y analizarlo con json_decode() para usarlo en mi solicitud. Sin embargo, en un momento dado, deseo que se envíe el ID de la aplicación al navegador. El problema es que si hago eco de esa variable, se imprime de la siguiente manera:

2.7110712626725E+14 

¿Hay alguna manera de evitar esto? No necesito que PHP lo amenace como un número ya que no estoy haciendo ningún cálculo con él; una cadena estaría bien. Pero como está representado solo por números, parece que json_decode() lo amenaza como un número, aunque sea difícil, pongo comillas alrededor de él (lo que debería indicar una cadena) o tal vez PHP hace una insinuación de tipo estúpida en este caso, no lo hago saber ...

¿Alguna idea sobre cómo manejar eso?

+0

No lo he probado, pero ¿y si usa 'sprintf', p. '$ foo = sprintf ("% d ", $ bar); echo $ foo; '? – slugonamission

+0

Esto se debe al límite de un entero con signo de 32 bits. – clentfort

+0

@slugonamission: Esto imprimiría "2147483647" en la pantalla con la aplicación_id utilizada anteriormente. –

Respuesta

16

que tenían el mismo problema aquí: Simplemente utilizar phps función Number_format, que resuelve este problema:

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

// 363924477024846 
+0

¡Eso funcionó! Gracias, hombre :) Aceptaré tu respuesta cuando pueda en 9 minutos. –

+0

De nada :) – sics

1

Prueba a transmitir en una cadena

echo((string)$theNumber); 
+0

Ya lo intenté, se hace eco de la misma salida. –

+0

intente var_dumping los datos y actualice su pregunta con ella, por favor. Esto puede ayudarnos a encontrar –

+0

. Parece que el problema surge en el momento en que se descodifica el valor de la cadena JSON. Ahí es cuando se trata como un entero, por lo que se trunca al valor máximo para un entero de 32 bits y, después de eso, no se puede recuperar el valor original. – octern

1

Una solución rápida y sucia sería añadir un poco de carácter al principio o al final de su número a la fuerza de PHP para tratarla como una cadena. Tal vez en lugar de "363924477024846" use "z363924477024846" y luego quite la z cuando necesite usarla. Obviamente añada esto antes de enviarlo.

+2

Eso también me vino a la mente. Pero eso significaría tener un archivo JSON "sucio" almacenado. Además, es muy probable que alguien que crea una nueva configuración JSON se olvide de eso en el futuro. –

0

Si puede cambiar el contenido del archivo JSON, ¿ha intentado envolver el ID de aplicación entre comillas, como por lo :

"app_id": "'363924477024846'" 

como clentfort ha dicho, eres superar el valor máximo de un entero de 32 bits (~ 2.1 mil millones firmado)

4

parece que json_decode tiene una opción para tratar enteros grandes como cadenas.

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

Esta debería ser la respuesta, los enteros grandes aún pueden redondearse en sistemas de 32 bits. Esto funciona cuando la respuesta aceptada no. – sunshinekitty

Cuestiones relacionadas