2012-03-08 33 views
5

He estado buscando por un tiempo, pero lo que puedo encontrar no es lo que busco. Necesito convertir un valor entero, que puede ser muy grande, en una cadena. Suena fácil: "$var"? No, porque esto puede llevar a la representación del número E+.Convertir un entero grande a una cadena completa en PHP

<?php 

$var = 10000000000000000000000000; 
echo $var."\n"; 
echo "'$var'\n"; 
echo (string) $var."\n"; 
echo strval($var); 

?> 

1.0E+25 
'1.0E+25' 
1.0E+25 
1.0E+25 

Cómo puedo hacer que la salida sea 10000000000000000000000000 en su lugar?

+3

Tenga en cuenta que su "muy gran número entero" no está representado en su ordenador como un entero, ya que supera los dos límites de 32 bits y 64 bits. – thetaiko

+1

$ var = '10000000000000000000000000'; –

+0

No puede hacer esto con un valor int nativo. Tendrá que ser almacenado como una cadena. Si estás haciendo operaciones matemáticas en este número, tendrás que usar la biblioteca [bcmath] (http://php.net/bcmath). –

Respuesta

8

Esto no se almacena como un entero por PHP, pero un flotador, es por eso que terminan con 1.0E + 25 en lugar de 10000000000000000000000000.

No es tristemente posible usar eso como un valor entero en PHP , ya que PHP no puede guardar un número entero de ese tamaño. Si esto viene de la base de datos, entonces será una cadena y puede hacer con ella lo que quiera. Si lo almacena en otro lugar, guárdelo como una cadena.

Su alternativa es almacenarlo como un flotador y tenerlo en cuenta en todo momento, aunque eso requiere conversiones adicionales y manejo en algunos lugares.

También se ha sugerido usar GNU Multiple Precision, pero eso no está habilitado en PHP de forma predeterminada.

$int=gmp_init("10000000000000000000000000"); 
$string=gmp_strval($int); 
echo $string; 
+0

Estaba a punto de sugerir GMP. No use un flotador: la precisión en ese número grande no es confiable. – AndrewR

2

UPDATE: encontrado el siguiente mensaje:

// strval() will lose digits around pow(2,45); 
echo pow(2,50); // 1.1258999068426E+015 
echo (string)pow(2,50); // 1.1258999068426E+015 
echo strval(pow(2,50)); // 1.1258999068426E+015 

// full conversion 
printf('%0.0f',pow(2,50)); // 112589906846624 
echo sprintf('%0.0f',pow(2,50)); // 112589906846624 

Uso printf o sprintf.

+0

Lo presento por error antes de agregar la segunda parte de la respuesta –

+0

Los flotantes no son confiables en este tamaño. 'echo sprintf ("% 0.0f ", 10000000000000000000000000);' en mi sistema muestra '10000000000000000905969664'. – AndrewR

2

El número entero que quiere expresar:

$var = 10000000000000000000000000; 

no está disponible en su sistema. Es demasiado grande y por lo tanto PHP convierte en un flotador que cambiará el número (ejemplo de sistema 32 bit):

 10000000000000000905969664 

límites comunes son:

yours : 10 000 000 000 000 000 000 000 000 
32 bit:      2 147 483 648 
64 bit:   9 223 372 036 854 775 808 

El cambio del valor se denomina punto flotante precisión, el PHP manual about integers le informará sobre el límite entero y the floats page about floating point precision (consulte la advertencia roja grande). Según el sistema en el que se encuentre, puede compilar PHP con los rangos que necesita su aplicación o debe usar otro tipo de datos, por ejemplo, con the gmp library, que puede seleccionar cadenas como números enteros y manejarlas.

El siguiente ejemplo muestra la salida justo, pero se puede hacer multiplicaciones etc .:

$r = gmp_init('10000000000000000000000000'); 
echo gmp_strval($r); 

la esperanza que esto sea útil.

Cuestiones relacionadas