/**
 * Format a number
 *
 * @param Number number The number to format
 * @param Number decimals The nb of decimals to display
 * @param String decimalsSeparator Defines the decimals separator
 * @param String thousandsSeparator Defines the thousands separator
 * @param Boolean rounded Defines if the number must be rounded
 *
 * @return String The number formatted
 */
function formatNumber( number, decimals, decimalsSeparator, thousandsSeparator, rounded ) {
    // checks if the number passed is not a numeric
    if( isNaN( number ) ) {
        return 0;
    }

    // initializes all vars
    var decimalIndex = 0;
    var decimalPart = '';
    var integerPart = '';
    var digit = 0;
    var numberFormatted = '';

    // checks if the numbers of decimals is not a numeric
    if( isNaN( decimals ) ) {
        decimals = 0;
    } else {
        // converts the parameter into an integer (float not allowed)
        decimals = parseInt( decimals );
    }

    // if the decimals separator is not a string, sets the default value
    if( typeof( decimalsSeparator ) != 'string' ) {
        decimalsSeparator = '.';
    }

    // if the throusands separator is not a string, sets the default value
    if( typeof( thousandsSeparator ) != 'string' ) {
        thousandsSeparator = ',';
    }

    number = number.toString();
    decimalIndex = number.indexOf('.');

    // if the number is a float
    if( decimalIndex > 0 ) {
        // if the number musts be rounded
        if( true === rounded ) {
            var power = Math.pow( 10, decimals );
            number = Math.round( number * power ) / power;
            
            // converts the number to a string, once the rounded is done
            number = number.toString();
        }
        
        // if the decimals wanted is greater than 0
        if( decimals > 0 ) {
            // extracts the decimal part with the numbers of decimals wanted
            decimalPart = decimalsSeparator + number.substr( decimalIndex + 1, decimals );

            // and adds the decimals separator if the decimals part is greater than 0
            if( parseInt( decimalPart ) > 0 ) {
                decimalPart = decimalsSeparator + decimalPart;
            } else {
                // removes the decimals part
                decimalPart = '';
            }
        }
        
        // calculates the integer part
        integerPart = number.substring( 0, decimalIndex );
    } else {
        integerPart = number;
    }

    // calculates the length of the integer part for the thousands formatting
    var integerLen = integerPart.length;
    while( integerLen > 0 ) {

        digit ++;

        numberFormatted = integerPart.substr( integerLen - 1, 1 ) + numberFormatted;

        // if the digit counter is ended on the last digit of the thousand
        // and if this is not the last thousand
        if( 3 == unit && integerLen > 1 ) {
            // adds the thousand separator
            numberFormatted = thousandsSeparator + numberFormatted;
            
            // resets the digit counter
            unit = 0;
        }
        integerLen --;
    }
    numberFormatted += decimalPart;
    return numberFormatted;
}

Comme vous avez pu vous en apercevoir, le paramètres "rounded" est définit à "true" par défaut.
Ceci est pour copier le comportement de la méthode de php.

De plus cette fonction s'avère à mon sens plus complète que celle de php car elle permet en outre de faire la distinction avec un nombre entier et décimal. Alors que la méthode php rajoutera des 0 après la virgule si le nombre est un entier que l'on souhaite afficher 2 décimals par exemple.

Je n'ai pas eu à aller si loin dans mon code, car je travaillais avec des entiers.
Même cette fonction a été améliorée pour le tutoriel.

Mais ce qui est sûr c'est que si un jour j'ai le moindre problème avec la fonction de php - vu les commentaires assez conséquents sur les problèmes qu'elle a engendrés - je la re-écrirai en me basant sur cette fonction javascript.

J'espère que cette petite astuce vous sera utile à vous aussi.

A++ ;)
Nairus

PS: Malgré mes nombreux tests, ma fonction n'est pas à l'arbri d'un cas d'utilisation oublié. Si vous en rencontrez un n'hésitez à m'en faire part, je ferais évoluer la fonction si nécessaire.