Comment écrire un prototype pour Number.toFixed en JavaScript?
-
22-07-2019 - |
Question
Je dois arrondir les nombres décimaux à six endroits à l'aide de JavaScript, mais je dois aussi prendre en compte les navigateurs existants. Je peut ne comptez pas sur Number.toFixed
Le gros problème avec toExponential, toFixed et toPrecision est qu’il s’agit de constructions assez modernes qui ne sont pas prises en charge dans Mozilla jusqu’à Firefox version 1.5 (bien que IE prenne en charge les méthodes depuis la version 5.5). Bien que ces méthodes soient la plupart du temps sûres, les anciens navigateurs SERONT brisés. Par conséquent, si vous écrivez un programme public, il est recommandé de fournir vos propres prototypes afin de fournir des fonctionnalités à ces méthodes pour les anciens navigateurs.
J'envisage d'utiliser quelque chose comme
Math.round(N*1000000)/1000000
Quelle est la meilleure méthode pour fournir ce prototype à des navigateurs plus anciens?
La solution
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);
}
Autres conseils
Je pense que Firefox 1.5 et IE 5 ne sont quasiment plus utilisés, ou par une très petite quantité de personnes.
C’est un peu comme coder pour supporter Netscape Navigator ... :-)
À moins qu'un autre navigateur principal (Opera? Safari? Improbable ...) ne le supporte pas, ou si vos journaux Web indiquent que le navigateur utilisé est très ancien, vous pouvez probablement utiliser ces méthodes.
Parfois, nous devons passer à autre chose. ^ _ ^
[EDIT] fonctionne bien sur Opera 9.50 et Safari 3.1
javascript: var num = 3.1415926535897932384; alert(num.toFixed(7));
L'article que vous avez mentionné est celui qui a été publié il y a un an et demi, une éternité dans l'industrie informatique ... Je pense que, contrairement aux utilisateurs d'IE, les utilisateurs de Firefox utilisent souvent la dernière version.
De site Web Bytes , 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);
}
}
Une autre option est (qui ne convertit pas inutilement une chaîne, mais corrige également le mauvais calcul de (162.295) .toFixed (2) à 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 */
Éditer: lors de l’essai de cette incarnation spécifique, this * = Math.pow (10, precision || 0)
crée une erreur d’attribution non valide de gauche. Donc, donnez au mot-clé this la variable a
. Cela aiderait aussi si je fermais mes fonctions ^ _ ^ ;;
Essayez ceci:
Number.prototype.toFixed = function(precision) {
var power = Math.pow(10, precision || 0);
return String(Math.round(this * power)/power);
}