Arrondir un nombre

Introduction

Les différentes implémentations d'ECMAScript, disposent de méthodes commme toLocaleString() qui devraient permettre un affichage formaté des nombres. Malheureusement, seules les versions récentes des navigateurs supportent ces méthodes, et renvoient quelquefois un résultat qui n'est pas celui escompté...

Voici un script qui permet d'obtenir un format de nombre modulable. La solution retenue est d'ajouter une méthode aux objets javascript Number et String. Ainsi l'utilisation est des plus simples : objet.decim().

Il est possible de donner deux arguments à la méthode d'abord le nombre de décimales (par défaut 2) puis le séparateur (point ou virgule, par défaut le point). On peut appeler la méthode ainsi objet.decim(3) ou encore objet.decim(2,","). Si on indique un séparateur autre que le point, ce sera la virgule !

Si le premier argument est négatif, on arrondira à la puissance de dix correspondant à la valeur absolue de cet argument. Ainsi 1234.decim(-2) arrondira le nombre 1234 à la centaine (100 = 10 puissance 2) la plus proche, soit 1200.

Il existe une méthode de l'objet Number à partir de JavaScript 1.5 et JScript 5, toFixed() qui permet d'obtenir un nombre arrondi au nombre de décimales souhaitées, mais elle n'est pas implémentée dans Netscape avant les versions 6, et possède un effet due la représentation interne des nombres. Par exemple, 0.045.toFixed(2) --> "0.04" avec certaines implémentations d'ECMAScript. Si vous souhaitez vérifier ce comportement sur votre navigateur, cliquez ici.

Exemples

Pour tester

Entrez un nombre avec plusieurs chiffres après le séparateur décimal (ce séparateur pourra être un point ou une virgule)

Affichage décimal du nombre :
Nombre de décimales :
Séparateur :
Résultat :

Le script

Vous l'obtiendrez soit en regardant le code source de la page, soit en le lisant plus bas, soit encore en le téléchargeant sous forme de fichier javascript externe.

    <script type="text/javascript"> 
   /*La fonction decim renvoie la valeur d'un nombre nb
    arrondie à d décimales avec, comme séparateur, un
    point ou une virgule. Elle accepte en entrée un nombre
    éventuellement décimal avec . ou , en séparateur (mais
    sans séparateur de milliers).

    La fonction peut être appelée ainsi :
    n.decim() --> renvoie un nombre à 2 décimales avec .
    n.decim(d) --> le nombre arrondie à d décimales . sép.
    n.decim(d,",") --> idem précédent avec , sép.
    
    La fonction retourne null si le nombre de décimales d est 
    décimal ou si d n'est pas numérique. Si d est négatif, elle
    arrondit le nombre à la puissance -d de 10. Elle retourne NaN
    si une valeur donnée de n n'est pas numérique ou convertible
    en nombre par javascript (on peut entrer des nombres en
    notation scientifique et n peut être négatif).

    La fonction est ajouté au prototype des nombres et des
    chaînes. Elle s'utilise comme une méthode des variables
    - ou des constantes - de type numérique ou chaîne.*/
            
    function decim(d,v) {
        var sign=false, nb=this;
        nb=nb.toString();
        if(!d && d!=0)d=2;
        if(d!=parseInt(d))return null;
        d=parseInt(d);
        v=(!v || v==".")?".":",";
        nb=nb.replace(/,/,".");
        nb=parseFloat(nb);
        if(isNaN(nb))return NaN;
            nb=Math.round(nb*Math.pow(10,d))
        if(nb<0){sign=true;nb=-nb}
            nb=nb.toString();
            
            while (nb.length<=d) nb="0"+nb;
            if(d>0){
            var re="(";
            while(re.length<=d)re+=".";
            re+="$)"
            re=new RegExp(re);
            nb=nb.replace(re,v+"$1");
        }
        else if(nb!="0")while(d++<0)nb+="0";
        if(sign)nb="-"+nb;
        return nb;
    }   // Ajout aux prototypes des objets String et Number 
    Number.prototype.decim=decim;
    String.prototype.decim=decim;

    </script>
          

Valid XHTML 1.0! Valid CSS!