Add commas or spaces to group every three digits

前端 未结 9 1607
日久生厌
日久生厌 2020-11-27 15:50

I have a function to add commas to numbers:

function commafy( num ) {
  num.toString().replace( /\\B(?=(?:\\d{3})+)$/g, \",\" );
}

Unfortun

相关标签:
9条回答
  • 2020-11-27 16:09

    Assuming your usage examples are not representative of already-working code but instead desired behavior, and you are looking for help with the algorithm, I think you are already on the right track with splitting on any decimals.

    Once split, apply the existing regex to the left side, a similiar regex adding the spaces instead of commas to the right, and then rejoin the the two into a single string before returning.

    Unless, of course, there are other considerations or I have misunderstood your question.

    0 讨论(0)
  • 2020-11-27 16:10

    Easiest way:

    1

    var num = 1234567890,
    result = num.toLocaleString() ;// result will equal to "1 234 567 890"
    

    2

    var num = 1234567.890,
    result = num.toLocaleString() + num.toString().slice(num.toString().indexOf('.')) // will equal to 1 234 567.890
    

    3

    var num = 1234567.890123,
    result = Number(num.toFixed(0)).toLocaleString() + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString()
    //will equal to 1 234 567.890 123
    

    4

    If you want ',' instead of ' ':

    var num = 1234567.890123,
    result = Number(num.toFixed(0)).toLocaleString().split(/\s/).join(',') + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString()
    //will equal to 1,234,567.890 123
    

    If not working, set the parameter like: "toLocaleString('ru-RU')" parameter "en-EN", will split number by the ',' instead of ' '

    All function used in my code are native JS functions. You'll find them in GOOGLE or in any JS Tutorial/Book

    0 讨论(0)
  • 2020-11-27 16:10

    Here you go edited after reading your comments.

    function commafy( arg ) {
       arg += '';                                         // stringify
       var num = arg.split('.');                          // incase decimals
       if (typeof num[0] !== 'undefined'){
          var int = num[0];                               // integer part
          if (int.length > 4){
             int     = int.split('').reverse().join('');  // reverse
             int     = int.replace(/(\d{3})/g, "$1,");    // add commas
             int     = int.split('').reverse().join('');  // unreverse
          }
       }
       if (typeof num[1] !== 'undefined'){
          var dec = num[1];                               // float part
          if (dec.length > 4){
             dec     = dec.replace(/(\d{3})/g, "$1 ");    // add spaces
          }
       }
    
       return (typeof num[0] !== 'undefined'?int:'') 
            + (typeof num[1] !== 'undefined'?'.'+dec:'');
    }
    
    0 讨论(0)
  • 2020-11-27 16:16

    Simple as that:

    var theNumber = 3500;
    theNumber.toLocaleString();
    
    0 讨论(0)
  • 2020-11-27 16:23

    This worked for me:

    function commafy(inVal){
       var arrWhole = inVal.split(".");
       var arrTheNumber = arrWhole[0].split("").reverse();
       var newNum = Array();
       for(var i=0; i<arrTheNumber.length; i++){
              newNum[newNum.length] = ((i%3===2) && (i<arrTheNumber.length-1)) ? "," + arrTheNumber[i]: arrTheNumber[i];
       }
       var returnNum = newNum.reverse().join("");
       if(arrWhole[1]){
              returnNum += "." + arrWhole[1];
       }
       return returnNum;
    }
    
    0 讨论(0)
  • 2020-11-27 16:30

    If you are happy with the integer part (I haven't looked at it closly), then:

    function formatDecimal(n) {
      n = n.split('.');
      return commafy(n[0]) + '.' + n[1];
    }
    

    Of course you may want to do some testing of n first to make sure it's ok, but that's the logic of it.

    Edit

    Ooops! missed the bit about spaces! You can use the same regular exprssion as commafy except with spaces instead of commas, then reverse the result.

    Here's a function based on vol7ron's and not using reverse:

    function formatNum(n) {
      var n = ('' + n).split('.');
      var num = n[0];
      var dec = n[1];
      var r, s, t;
    
      if (num.length > 3) {
        s = num.length % 3;
    
        if (s) {
          t = num.substring(0,s);
          num = t + num.substring(s).replace(/(\d{3})/g, ",$1");
        } else {
          num = num.substring(s).replace(/(\d{3})/g, ",$1").substring(1);
        }
      }
    
      if (dec && dec.length > 3) {
        dec = dec.replace(/(\d{3})/g, "$1 ");
      }
    
      return num + (dec? '.' + dec : '');
    }
    
    0 讨论(0)
提交回复
热议问题