2008-12-03 19 views
5

necesito para redondear números decimales con seis cifras utilizando JavaScript, pero tengo que considerar navegadores antiguos así que can't rely on Number.toFixedCómo escribir un prototipo para Number.toFixed en JavaScript?

La gran captura con toExponential, toFixed y toPrecision es que son construcciones bastante modernos no admitidas en Mozilla hasta Firefox versión 1.5 (aunque IE apoyó los métodos desde la versión 5.5). Si bien es más seguro utilizar estos métodos, los navegadores más antiguos se romperán, por lo que si está escribiendo un programa público, se recomienda que proporcione sus propios prototipos para proporcionar la funcionalidad de estos métodos para el navegador más antiguo.

Estoy pensando en usar algo como

Math.round(N*1000000)/1000000 

¿Cuál es el mejor método para la prestación de este prototipo para navegadores antiguos?

Respuesta

15

Prueba esto:

if (!Number.prototype.toFixed) 

    Number.prototype.toFixed = function(precision) { 
     var power = Math.pow(10, precision || 0); 
     return String(Math.round(this * power)/power); 
    } 
+1

Si bien algunos pueden no considerar esto como un javascript en shim o shiv, la presencia de esas palabras en esta página habría hecho que mi búsqueda en Google fuera 10 segundos más rápida;) –

0

Creo que Firefox 1.5 e IE 5 ya no se utilizan, o por una cantidad muy pequeña de personas.
Es un poco como la codificación para admitir Netscape Navigator ... :-)
A menos que algún otro navegador importante (Opera? Safari? Improbable ...) no admita esto, o si los registros web muestran mucho legado uso del navegador, probablemente solo puedas usar estos métodos.
En algún momento, tenemos que seguir adelante.^_^

[EDIT] funciona bien en Opera 9.50 y Safari 3,1

javascript: var num = 3.1415926535897932384; alert(num.toFixed(7)); 

El artículo hace referencia es de hace un año y medio, una eternidad en la industria de TI ... Creo que, a diferencia de IE usuarios, los usuarios de Firefox a menudo van a la última versión.

+2

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. –

+2

@PatrickKostjens ¿sabe que está criticando una respuesta dada hace 5 años? ("una eternidad en la industria de TI", para citarme a mí mismo ...) Si planea criticar todo este tipo de respuestas en SO, ¡tiene algo de trabajo por delante! :-) Además, es una respuesta real, en cierto sentido, a OP no le deberían importar los navegadores que ya estaban obsoletos en el momento de la pregunta ... es decir. que su pregunta fue probablemente inútil. – PhiLho

+2

No era consciente de eso. Estoy de acuerdo que es un tiempo muy largo. Esta publicación estaba en mi cola de revisión.Creo que fue marcado como de mala calidad por alguien, de lo contrario no sé por qué aparecería para su revisión. –

0

De Bytes website, esta función es casi el mismo que Serge llinsky de:

if (!num.toFixed) 
{ 
    Number.prototype.toFixed = function(precision) 
    { 
    var num = (Math.round(this*Math.pow(10,precision))).toString(); 
    return num.substring(0,num.length-precision) + "." + 
      num.substring(num.length-precision, num.length); 
    } 
} 
0

Otra opción es (que no se convierte a una cadena innecesariamente, y también corrige el error de cálculo de (162.295) .a Arreglado (2) a 162.29 (debe ser 162.30)).

Number.prototype._toFixed=Number.prototype.toFixed; //Preserves the current function 
Number.prototype.toFixed=function(precision){ 
/* step 1 */ var a=this, pre=Math.pow(10,precision||0); 
/* step 2 */ a*=pre; //currently number is 162295.499999 
/* step 3 */ a = a._toFixed(2); //sets 2 more digits of precision creating 16230.00 
/* step 4 */ a = Math.round(a); 
/* step 5 */ a/=pre; 
/* step 6 */ return a._toFixed(precision); 
} 
/*This last step corrects the number of digits from 162.3 (which is what we get in
step 5 to the corrected 162.30. Without it we would get 162.3 */

Editar: Al tratar esta encarnación específica, this*=Math.pow(10, precision||0) crea una asignación de la izquierda de error no válido. Así que le dio a esta palabra clave la variable a. También ayudaría si cerrara mis funciones^_^;;

0

Prueba esto:

Number.prototype.toFixed = function(precision) { 
    var power = Math.pow(10, precision || 0); 
    return String(Math.round(this * power)/power); 
} 
Cuestiones relacionadas