Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing in number, Number.prototype.format

I've seen this format function referenced on several sites, but none of them have an explicit example of how to pass in a number into the function.

I've tried '12345'.format('0.00') which I believe is how it should be written, but it gives me the error that the object doesn't support the property or method. I've also tried Number('12345').format('0.00'); var num = '12345' // num.format('0.00'); format('0.00','12345') and have even tried using numbers instead of strings 12345.format(0.00). Am I missing something really obvious here?

Included copy of function for reference so you don't have to go to the site (with all missing pieces filled in).

/**
 * I ♥ Google
 */
String.prototype.stripNonNumeric = function() {
    var str = this + '';
    var rgx = /^\d|\.|-$/;
    var out = '';
    for( var i = 0; i < str.length; i++ ) {
        if( rgx.test( str.charAt(i) ) ) {
            if( !( ( str.charAt(i) == '.' && out.indexOf( '.' ) != -1 ) ||
            ( str.charAt(i) == '-' && out.length != 0 ) ) ) {
                out += str.charAt(i);
            }
        }
    }
    return out;
};

/**
 * Formats the number according to the 'format' string; adherses to the american number standard where a comma is inserted after every 3 digits.
 *  note: there should be only 1 contiguous number in the format, where a number consists of digits, period, and commas
 *        any other characters can be wrapped around this number, including '$', '%', or text
 *        examples (123456.789):
 *          '0' - (123456) show only digits, no precision
 *          '0.00' - (123456.78) show only digits, 2 precision
 *          '0.0000' - (123456.7890) show only digits, 4 precision
 *          '0,000' - (123,456) show comma and digits, no precision
 *          '0,000.00' - (123,456.78) show comma and digits, 2 precision
 *          '0,0.00' - (123,456.78) shortcut method, show comma and digits, 2 precision
 *
 * @method format
 * @param format {string} the way you would like to format this text
 * @return {string} the formatted number
 * @public
 */
Number.prototype.format = function(format) {
    if (!(typeof format == "string")) {return '';} // sanity check

    var hasComma = -1 < format.indexOf(','),
        psplit = format.stripNonNumeric().split('.'),
        that = this;

    // compute precision
    if (1 < psplit.length) {
        // fix number precision
        that = that.toFixed(psplit[1].length);
    }
    // error: too many periods
    else if (2 < psplit.length) {
        throw('NumberFormatException: invalid format, formats should have no more than 1 period: ' + format);
    }
    // remove precision
    else {
        that = that.toFixed(0);
    }

    // get the string now that precision is correct
    var fnum = that.toString();

    // format has comma, then compute commas
    if (hasComma) {
        // remove precision for computation
        psplit = fnum.split('.');

        var cnum = psplit[0],
            parr = [],
            j = cnum.length,
            m = Math.floor(j / 3),
            n = cnum.length % 3 || 3; // n cannot be ZERO or causes infinite loop

        // break the number into chunks of 3 digits; first chunk may be less than 3
        for (var i = 0; i < j; i += n) {
            if (i != 0) {n = 3;}
            parr[parr.length] = cnum.substr(i, n);
            m -= 1;
        }

        // put chunks back together, separated by comma
        fnum = parr.join(',');

        // add the precision back in
        if (psplit[1]) {fnum += '.' + psplit[1];}
    }

    // replace the number portion of the format with fnum
    return format.replace(/[\d,?\.?]+/, fnum);
};
like image 816
Choy Avatar asked Nov 14 '22 10:11

Choy


1 Answers

That is not the complete code - it's missing isType and stripNonNumeric methods. But anyways, since it's an extension on the Number objects itself, you can use it as:

(42).format('0.00');

or

var a = 42;
a.format('0.00');

'12345'.format('0.00') will not work as '12345' here is a string, but the method has been defined for a Number only.

See this question for why you need to enclose the number within parentheses, and ways you can get past it without using them, though I wouldn't recommend it - cause of all these rumors about maintenance programmers and axes and stuff. I'm not saying every maintenance programmer carries one in their backpacks, but why take chances. They loving hacking too but not with code.. hahahaha

like image 96
Anurag Avatar answered Dec 05 '22 05:12

Anurag