2008-12-03 10 views
5

J'ai besoin pour arrondir les nombres décimaux à six endroits en utilisant JavaScript, mais je dois considérer les navigateurs existants pour que je can't rely on Number.toFixedComment écrire un prototype pour Number.toFixed en JavaScript?

La grosse prise avec toExponential, toFixed et toPrecision est qu'ils sont des constructions assez modernes, non pris en charge dans Mozilla jusqu'à Firefox version 1.5 (même si IE supportait les méthodes depuis la version 5.5). Bien qu'il soit préférable d'utiliser ces méthodes en toute sécurité, les anciens navigateurs se briseront donc si vous écrivez un programme public, il est recommandé de fournir vos propres prototypes pour fournir des fonctionnalités pour ces méthodes pour les navigateurs plus anciens.

J'envisage d'utiliser quelque chose comme

Math.round(N*1000000)/1000000 

Quelle est la meilleure méthode pour fournir ce prototype aux navigateurs plus anciens?

Répondre

15

Essayez ceci:

if (!Number.prototype.toFixed) 

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

Alors que certains pourraient ne pas considérer cela comme un javascript à FIXED shim ou un shiv, la présence de ces mots sur cette page aurait rendu ma recherche google environ 10 secondes plus rapidement;) –

0

Je pense que Firefox 1.5 et IE 5 ne sont pratiquement plus utilisés, ou par un très petit nombre de personnes.
C'est un peu comme le codage pour supporter Netscape Navigator ... :-)
A moins qu'un autre navigateur majeur (Opera? Safari? Improbable ...) ne supporte pas cela, ou si vos logs Web montrent beaucoup d'héritage utilisation du navigateur, vous pouvez probablement utiliser ces méthodes.
Parfois, nous devons passer à autre chose.^_^

[EDIT] fonctionne très bien sur Opera 9.50 et Safari 3,1

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

L'article que vous faites référence est il y a un an et demi, une éternité dans l'industrie ... Je pense que, contrairement à IE utilisateurs, les utilisateurs de Firefox vont souvent à la dernière version.

+2

Cela ne permet pas de répondre à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. –

+2

@PatrickKostjens savez-vous que vous critiquez une réponse donnée il y a 5 ans? ("une éternité dans l'industrie informatique", pour me citer ...) Si vous envisagez de critiquer toutes ces sortes de réponses dans SO, vous avez du travail à faire! :-) De plus, c'est une vraie réponse dans un sens où l'OP ne devrait pas se soucier des navigateurs qui étaient déjà obsolètes au moment de la question ... C'est à dire. que sa question était probablement inutile. – PhiLho

+2

Je n'étais pas au courant de cela. Je suis d'accord que c'est très long. Ce message était dans ma file d'attente.Je pense qu'il a été signalé faible qualité par quelqu'un, sinon je ne sais pas pourquoi il se présenterait pour examen. –

0

De Bytes website, cette fonction est presque le même que celui de Serge llinsky:

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

Une autre option est (ce qui ne se transforme pas en une chaîne inutilement, et aussi corrige le mauvais calcul de (162.295) .toFixer (2) en 162.29 (devrait être 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 */

Edit: A essayer cette incarnation spécifique, this*=Math.pow(10, precision||0) crée une erreur invalide la cession à la main gauche. Alors donné le mot-clé this la variable a. Cela aiderait aussi si je fermais mes fonctions^_^;;

0

Essayez ceci:

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