Format numbers in JavaScript similar to C#

后端 未结 18 2113
傲寒
傲寒 2020-11-22 12:26

Is there a simple way to format numbers in JavaScript, similar to the formatting methods available in C# (or VB.NET) via ToString(\"format_provider\") or

相关标签:
18条回答
  • 2020-11-22 12:54

    Here's a simple JS function to add commas to an integer number in string format. It will handle whole numbers or decimal numbers. You can pass it either a number or a string. It obviously returns a string.

    function addCommas(str) {
        var parts = (str + "").split("."),
            main = parts[0],
            len = main.length,
            output = "",
            first = main.charAt(0),
            i;
    
        if (first === '-') {
            main = main.slice(1);
            len = main.length;    
        } else {
            first = "";
        }
        i = len - 1;
        while(i >= 0) {
            output = main.charAt(i) + output;
            if ((len - i) % 3 === 0 && i > 0) {
                output = "," + output;
            }
            --i;
        }
        // put sign back
        output = first + output;
        // put decimal part back
        if (parts.length > 1) {
            output += "." + parts[1];
        }
        return output;
    }
    

    Here's a set of test cases: http://jsfiddle.net/jfriend00/6y57j/

    You can see it being used in this previous jsFiddle: http://jsfiddle.net/jfriend00/sMnjT/. You can find functions that will handle decimal numbers too with a simple Google search for "javascript add commas".

    Converting a number to a string can be done many ways. The easiest is just to add it to a string:

    var myNumber = 3;
    var myStr = "" + myNumber;   // "3"
    

    Within, the context of your jsFiddle, you'd get commas into the counter by changing this line:

    jTarget.text(current);
    

    to this:

    jTarget.text(addCommas(current));
    

    You can see it working here: http://jsfiddle.net/jfriend00/CbjSX/

    0 讨论(0)
  • 2020-11-22 12:54

    In case you want to format number for view rather than for calculation you can use this

    function numberFormat( number ){
    
        var digitCount = (number+"").length;
        var formatedNumber = number+"";
        var ind = digitCount%3 || 3;
        var temparr = formatedNumber.split('');
    
        if( digitCount > 3 && digitCount <= 6 ){
    
            temparr.splice(ind,0,',');
            formatedNumber = temparr.join('');
    
        }else if (digitCount >= 7 && digitCount <= 15) {
            var temparr2 = temparr.slice(0, ind);
            temparr2.push(',');
            temparr2.push(temparr[ind]);
            temparr2.push(temparr[ind + 1]);
            // temparr2.push( temparr[ind + 2] ); 
            if (digitCount >= 7 && digitCount <= 9) {
                temparr2.push(" million");
            } else if (digitCount >= 10 && digitCount <= 12) {
                temparr2.push(" billion");
            } else if (digitCount >= 13 && digitCount <= 15) {
                temparr2.push(" trillion");
    
            }
            formatedNumber = temparr2.join('');
        }
        return formatedNumber;
    }
    

    Input: {Integer} Number

    Outputs: {String} Number

    22,870 => if number 22870

    22,87 million => if number 2287xxxx (x can be whatever)

    22,87 billion => if number 2287xxxxxxx

    22,87 trillion => if number 2287xxxxxxxxxx

    You get the idea

    0 讨论(0)
  • 2020-11-22 12:56

    I wrote a simple function (not yet another jQuery plugin needed!!) that converts a number to a decimal separated string or an empty string if the number wasn't a number to begin with:

    function format(x) {
        return isNaN(x)?"":x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }
    

    format(578999); results in 578,999

    format(10); results in 10

    if you want to have a decimal point instead of a comma simply replace the comma in the code with a decimal point.

    One of the comments correctly stated this only works for integers, with a few small adaptions you can make it work for floating points as well:

    function format(x) {
        if(isNaN(x))return "";
    
        n= x.toString().split('.');
        return n[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")+(n.length>1?"."+n[1]:"");
    }
    
    0 讨论(0)
  • 2020-11-22 12:56

    Firstly, converting an integer into string in JS is really simple:

    // Start off with a number
    var number = 42;
    // Convert into a string by appending an empty (or whatever you like as a string) to it
    var string = 42+'';
    // No extra conversion is needed, even though you could actually do
    var alsoString = number.toString();
    

    If you have a number as a string and want it to be turned to an integer, you have to use the parseInt(string) for integers and parseFloat(string) for floats. Both of these functions then return the desired integer/float. Example:

    // Start off with a float as a string
    var stringFloat = '3.14';
    // And an int as a string
    var stringInt = '42';
    
    // typeof stringInt  would give you 'string'
    
    // Get the real float from the string
    var realFloat = parseFloat(someFloat);
    // Same for the int
    var realInt = parseInt(stringInt);
    
    // but typeof realInt  will now give you 'number'
    

    What exactly are you trying to append etc, remains unclear to me from your question.

    0 讨论(0)
  • 2020-11-22 12:56

    You can do it in the following way: So you will not only format the number but you can also pass as a parameter how many decimal digits to display, you set a custom decimal and mile separator.

    function format(number, decimals = 2, decimalSeparator = '.', thousandsSeparator = ',') {
        const roundedNumber = number.toFixed(decimals);
        let integerPart = '', fractionalPart = '';
        if (decimals == 0) {
            integerPart = roundedNumber;
            decimalSeparator = '';
        } else {
            let numberParts = roundedNumber.split('.');
            integerPart = numberParts[0];
            fractionalPart = numberParts[1];
        }
        integerPart = integerPart.replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${thousandsSeparator}`);
        return `${integerPart}${decimalSeparator}${fractionalPart}`;
    }
    

    Use:

    let min = 1556454.0001;
    let max = 15556982.9999;
    console.time('number format');
    for (let i = 0; i < 15000; i++) {
        let randomNumber = Math.random() * (max - min) + min;
    
        let formated = format(randomNumber, 4, ',', '.'); // formated number
    
        console.debug('number: ', randomNumber, 'formated: ', formated);
    }
    console.timeEnd('number format');
    
    0 讨论(0)
  • 2020-11-22 13:01

    You should probably have a look at the JQuery NUMBERFORMATTER plugin:

    Jquery Number Formatter

    And this question:

    Javascript easier way to format numbers

    0 讨论(0)
提交回复
热议问题