添加逗号或空格以每三位数字分组

IT技术 javascript string-formatting
2021-02-16 03:22:36

我有一个为数字添加逗号的函数:

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

不幸的是,它不太喜欢小数。鉴于以下使用示例,扩展我的功能的最佳方法是什么?

commafy( "123" )                 // "123"
commafy( "1234" )                // "1234"
                                 // Don't add commas until 5 integer digits
commafy( "12345" )               // "12,345"
commafy( "1234567" )             // "1,234,567"
commafy( "12345.2" )             // "12,345.2"
commafy( "12345.6789" )          // "12,345.6789"
                                 // Again, nothing until 5
commafy( ".123456" )             // ".123 456"
                                 // Group with spaces (no leading digit)
commafy( "12345.6789012345678" ) // "12,345.678 901 234 567 8"

想必最简单的方法是先在小数点上拆分(如果有的话)。从那里去哪里最好?

6个回答

只需用'.'分成两部分 并单独格式化它们。

function commafy( num ) {
    var str = num.toString().split('.');
    if (str[0].length >= 5) {
        str[0] = str[0].replace(/(\d)(?=(\d{3})+$)/g, '$1,');
    }
    if (str[1] && str[1].length >= 5) {
        str[1] = str[1].replace(/(\d{3})/g, '$1 ');
    }
    return str.join('.');
}
我做了一个基于valjok.blogspot.com/2014/07/...
2021-05-08 03:22:36

就那么简单:

var theNumber = 3500;
theNumber.toLocaleString();
toLocaleString() 在我的机器上将数字的精度降低到小数点后 3 位.. 这可能不是你想要的..
2021-04-23 03:22:36
toLocaleString 可以使用选项。您可能想要使用的“maximumFractionDigits”可以在 1 - 21 的范围内。要查看完整说明developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-23 03:22:36

以下是我认为可能有用的两种简洁方法:

  1. Number.prototype.toLocaleString

此方法可以将数字转换为具有语言敏感表示的字符串。它允许两个参数,即locales& options这些参数可能有点令人困惑,有关更多详细信息,请参阅上面来自 MDN 的文档。

总之,你可以简单地使用如下:

console.log(
   Number(1234567890.12).toLocaleString()
)
// log -> "1,234,567,890.12"

如果您看到我的不同之处,因为我们忽略了两个参数,它将根据您的操作系统返回一个字符串。

  1. 使用正则表达式匹配一个字符串,然后替换为一个新字符串。

    我们为什么考虑这个?toLocaleString()有点令人困惑,并非所有浏览器都支持,toLocaleString()也会四舍五入,所以我们可以用另一种方式来做。

// The steps we follow are:
// 1. Converts a number(integer) to a string.
// 2. Reverses the string.
// 3. Replace the reversed string to a new string with the Regex
// 4. Reverses the new string to get what we want.

// This method is use to reverse a string.
function reverseString(str) { 
    return str.split("").reverse().join("");  
}

/**
 * @param {string | number} 
 */
function groupDigital(num) {
  const emptyStr = '';
  const group_regex = /\d{3}/g;

  // delete extra comma by regex replace.
  const trimComma = str => str.replace(/^[,]+|[,]+$/g, emptyStr)


  const str = num + emptyStr;
  const [integer, decimal] = str.split('.')

  const conversed = reverseString(integer);

  const grouped = trimComma(reverseString(
    conversed.replace(/\d{3}/g, match => `${match},`)
  ));

  return !decimal ? grouped : `${grouped}.${decimal}`;
}


console.log(groupDigital(1234567890.1234)) // 1,234,567,890.1234
console.log(groupDigital(123456))  // 123,456
console.log(groupDigital("12.000000001"))  // 12.000000001

Tips: 1. 可以对第二种方式进行扩展,更加灵活适用。2. 为避免被截断,您应该使用字符串优先而不是数字作为输入。
2021-04-29 03:22:36

最简单的方法:

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

如果你想要 ',' 而不是 ' ':

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

如果不起作用,请将参数设置为:“toLocaleString('ru-RU')”参数“en-EN”,将按 ',' 而不是 ' ' 分割数字

我的代码中使用的所有函数都是原生 JS 函数。您可以在 GOOGLE 或任何 JS 教程/书籍中找到它们

请评论所有使用的功能是做什么的。文档链接也很有用
2021-05-15 03:22:36

如果您对整数部分感到满意​​(我没有仔细看过它),那么:

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

当然,您可能想先对n进行一些测试以确保它没问题,但这就是它的逻辑。

编辑

oop!错过了关于空间的一点!除了使用空格而不是逗号之外,您可以使用与commafy 相同的正则表达式,然后反转结果。

这是一个基于 vol7ron 且不使用反向的函数:

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 : '');
}
将字符串反转两次有点尴尬;有一个适用于其他方式的正则表达式会很好。
2021-04-17 03:22:36
@Shrike——我没有看到任何糟糕的底片!!通过修剪标志(如果有的话)并在最后将其放回即可轻松容纳。;-)
2021-04-18 03:22:36
@Ben,您可以遍历字符串,但我认为反转两次会更快。纯正则表达式方法需要回溯,我认为 JavaScript/ECMAScript 没有添加到标准中。
2021-05-07 03:22:36
不太正确: formatNum(-1234) => "-1 234" formatNum(-12345) => " 12345" formatNum(-123456) => "- 123 456"
2021-05-15 03:22:36
@vol7ron - 您还可以使用 substring 来获得 3 的偶数倍以添加逗号,然后将额外的位放回去。
2021-05-17 03:22:36