使用自定义分隔符的Number.toLocaleString()函数

5
我需要在JavaScript中格式化一个数字,并且千位分隔符和小数点分隔符可能在运行时被定义。但这种组合可能与特定地区的语言环境不匹配。
是否有一种方法可以在JavaScript的toLocaleString()中提供千位和小数点分隔符?或者明确地使用我定义的值来使用NumberFormat?
我看到有些示例使用语言环境代码,还有一些使用其他值(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString),但这些都不适用于我的用例。

1
http://stackoverflow.com/questions/37994133/change-decimal-mark/37994346#37994346 - Teemu
正如我在问题中提到的,我不知道期望的小数点和千位分隔符,直到运行时,因此为此示例设置区域设置是不可行的。 - dougajmcdonald
实际上有三种不同的分隔符:逗号,、句点.和空格。可以在运行时检测正确的组合,并选择合适的语言标记。还是定界符完全自定义,例如ax等? - Teemu
@Teemu 目前它们肯定只是标准分隔符,但根据安装情况可能会进行切换。你说得对,正确的组合可以被检测出来,但我不确定最好的方法是什么,你有什么建议吗? - dougajmcdonald
1
创建一个对象,并根据分隔符组合命名属性。就像在这个jsFiddle中一样。我只是无法找到使用空格作为千位分隔符和小数点的区域设置,也许你会找到。 - Teemu
1
有趣的解决方案!我认为目前客户不会喜欢使用与其国家不匹配的语言环境(即使他们希望使用自定义(非标准)格式)。不过这也值得知道。 - dougajmcdonald
3个回答

8

一种选项是使用已知分隔符格式化为字符串,然后使用未知分隔符进行查找/替换。

function formatNum(num, separator, fraction) {
  var str = num.toLocaleString('en-US');
  str = str.replace(/\./, fraction);
  str = str.replace(/,/g, separator);
  return str;
}

formatNum(12342.2, "a", "x");
//12a342x2

1
这既是一个明智又可怕的解决方案!我既恨又爱它! - dougajmcdonald
这实际上是一个非常聪明和优雅的解决方案,拉里!只要 en-US 格式不改变,一切都应该没问题! - Victor
1
重要提示:使用此代码,分数符号除了逗号以外的任何字符都将被千位分隔符替换。 - Victor
num.toLocaleString('fullwide')应该更好用,可以避免可能的科学计数法。 - barbatus

0
有一个名为formatToPartsIntl.NumberFormat方法,具有足够的细粒度来正确执行此操作。
以下是将所有千位分隔符更改为下划线的示例:
const formatter = Intl.NumberFormat(undefined); // Undefined locale == use the user's resolved locale

const parts = formatter.formatToParts(123456789.987654321);
parts.filter(p => p.type === 'group').forEach(p => p.value = '_');
const formatted = parts.map(p => p.value).join('');
formatted // '123_456_789.988'

FWIW,formatToParts()的返回值如下所示:
[{type: 'integer',  value: '123'},
 {type: 'group',    value: ','  },
 {type: 'integer',  value: '456'},
 {type: 'group',    value: ','  },
 {type: 'integer',  value: '789'},
 {type: 'decimal',  value: '.'  },
 {type: 'fraction', value: '988'}]

如果你需要调整小数点分隔符,也很容易。
如果 MDN 文档没有足够的细节,ecma 402 规范涵盖了这些部分

0

这个页面上原来的答案如果使用逗号作为小数分隔符(参数fraction),就不能正常工作。这是有问题的,因为在欧洲许多地方都使用逗号作为小数分隔符,例如西班牙、法国、挪威、捷克、丹麦等。

为了使它正常工作,可以通过两个步骤进行替换,而不是直接替换。中间需要使用一个占位符来表示小数符号。

function formatNum(num, separator, fraction) {
    return num
        .toLocaleString('en-US');
        .replace(/\./, "<fraction>")
        .replace(/,/g, separator)
        .replace(/<fraction>/, fraction);
}

formatNum(12342.2, " ", ",");
//12 342,2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接