2010-11-13 20 views
5

Necesito obtener el valor de un número extremadamente grande en JavaScript en forma no exponencial. Number.toFixed simplemente lo devuelve en forma exponencial como una cadena, que es peor que lo que tenía.Opuesto a Number.toExponential en JS

Esto es lo que Number.toFixed devuelve:

>>> x = 1e+31 
1e+31 
>>> x.toFixed() 
"1e+31" 

Number.toPrecision tampoco funciona:

>>> x = 1e+31 
1e+31 
>>> x.toPrecision(21) 
"9.99999999999999963590e+30" 

Lo que me gustaría es:

>>> x = 1e+31 
1e+31 
>>> x.toNotExponential() 
"10000000000000000000000000000000" 

podría escribir mi propio analizador, pero Prefiero usar un método JS nativo, si existe.

Respuesta

1

La respuesta es que no hay tal función incorporada. He buscado alto y bajo. Aquí es la expresión regular que utilizo para dividir el número en la muestra, el coeficiente (dígitos antes del punto decimal), parte fraccionaria (dígitos después del punto decimal) y el exponente:

/^([+-])?(\d+)\.?(\d*)[eE]([+-]?\d+)$/ 

"Cómo crear sus propios" es la respuesta, que se Ya hecho.

+0

Hace tiempo que olvidé lo que hice para resolver esto, pero tiene razón en que no hay un método incorporado para hacerlo. –

+0

@Oz ¡Hola, gracias, finalmente puedo comentar las preguntas! Eso es un gran problema con los métodos de impresión incorporados, algo así como un "printf" seguramente sería bueno. Estoy trabajando en una clase personalizada NumberFormatter ahora ... –

4

Puede utilizar toPrecision con un parámetro que especifica el número de dígitos que desea visualizar:

x.toPrecision(31) 

Sin embargo, entre los navegadores que he probado, el código anterior sólo funciona en Firefox. De acuerdo con la especificación ECMAScript, el rango válido para toPrecision es de 1 a 21, y tanto IE como Chrome lanzan un RangeError en consecuencia. Esto se debe al hecho de que la representación de coma flotante utilizada en JavaScript es incapaz de representar realmente números con 31 dígitos de precisión.

+1

estoy bien con ella de no ser un número real cuando lo reciba (que es para fines de visualización), pero doesn toPrecision No funciona ni para números mayores que 1e + 21. En este caso particular, recibo "9.99999999999999963590e + 30". Actualizaré la pregunta en consecuencia. –

+0

@Oz: Sí, eso es lo que mencioné. No creo que haya otra forma incorporada de obtener cadenas para números tan grandes. – casablanca

0

Es posible expandir la salida exponencial de JavaScript utilizando funciones de cadena. Es cierto que lo que me ocurrió es algo críptica, pero funciona si el exponente después de la e es positivo:

var originalNumber = 1e+31; 
var splitNumber = originalNumber.toString().split('e'); 

var result; 
if(splitNumber[1]) { 
    var regexMatch = splitNumber[0].match(/^([^.]+)\.?(.*)$/); 
    result = 
     /* integer part */ regexMatch[1] + 
     /* fractional part */ regexMatch[2] + 
     /* trailing zeros */ Array(splitNumber[1] - regexMatch[2].length + 1).join('0'); 
} else result = splitNumber[0]; 
+0

Actualmente estoy usando mi propia función de conversión que divide la versión toString del número, similar a la tuya sin la unión vacía de Array. Sin embargo, estoy buscando una función JS nativa para hacer esto por mí. –

1

"10000000000000000000000000000000"?

difícil de creer que alguien prefiere mirar eso de 1,0E + 31,

o en html: 10 . Pero aquí es una manera, gran parte de ella es para exponentes negativos (fracciones):

function longnumberstring(n){ 
    var str, str2= '', data= n.toExponential().replace('.','').split(/e/i); 
    str= data[0], mag= Number(data[1]); 
    if(mag>=0 && str.length> mag){ 
     mag+=1; 
     return str.substring(0, mag)+'.'+str.substring(mag);    
    } 
    if(mag<0){ 
     while(++mag) str2+= '0'; 
     return '0.'+str2+str; 
    } 
    mag= (mag-str.length)+1; 
    while(mag> str2.length){ 
     str2+= '0'; 
    } 
    return str+str2; 
} 



input: 1e+30 
longnumberstring: 1000000000000000000000000000000 
to Number: 1e+30 
input: 1.456789123456e-30 
longnumberstring: 0.000000000000000000000000000001456789123456 
to Number: 1.456789123456e-30 
input: 1.456789123456e+30 
longnumberstring: 1456789123456000000000000000000 
to Number: 1.456789123456e+30 
input: 1e+80 longnumberstring: 100000000000000000000000000000000000000000000000000000000000000000000000000000000 
to Number: 1e+80 
+0

Debe mostrarse como un valor en dólares y $ 1e + 31 no se lee bien. El valor es tan alto porque es la entrada del usuario y los usuarios están locos. Gracias por la función, pero ya tengo una función que escribí para hacerlo, me preguntaba si había una función incorporada. –

1

Uso Número (cadena)

Ejemplo: var a=Number("1.1e+2"); da a = 110

+0

Eso es lo contrario de lo que estoy buscando. Hay muchas maneras de pasar de una cadena a un número, pero estoy buscando pasar de un número extremadamente grande a una cadena sin usar la exponenciación. –

+0

así que qué hay sobre var a = Number ("9.9E-8"); ?? No funciona.. :( –