JavaScript是否考虑了本地小数分隔符?

Stu*_*egg 5 javascript localization

我有一个网页,以用户的本地化格式显示小数,如下所示:

  • 英语: 7.75
  • 荷兰人: 7,75

如果我在我的机器上的JavaScript中添加两个数字变量(其中数字来自上述格式的字符串),我得到以下结果:

  • 英语: 7.75 + 7.75 = 15.5
  • 荷兰人: 7,75 + 7,75 = 0

如果我要在荷兰用户计算机上运行此代码,我应该期望返回英文格式的添加0,并返回荷兰格式的添加15,5吗?

简而言之:JavaScript计算是否在其字符串中使用局部小数分隔符来编号转换?

nai*_*rch 17

以下是区域设置感知号码解析器的示例:

function parseLocaleNumber(stringNumber) {
    var thousandSeparator = (1111).toLocaleString().replace(/1/g, '');
    var decimalSeparator = (1.1).toLocaleString().replace(/1/g, '');

    return parseFloat(stringNumber
        .replace(new RegExp('\\' + thousandSeparator, 'g'), '')
        .replace(new RegExp('\\' + decimalSeparator), '.')
    );
}
Run Code Online (Sandbox Code Playgroud)

它使用浏览器的当前语言环境来替换千位和小数分隔符.

具有德国语言环境设置

var n = parseLocaleNumber('1.000.045,22');
Run Code Online (Sandbox Code Playgroud)

n将等于1000045.22.


Koo*_*Inc 7

不,分隔符始终是javascript中的点(.)Number.因此,7,75评估为75,因为,调用从左到右的评估(在控制台中尝试它:x=1,x+=1,alert(x)或者更重要的是var x=(7,75); alert(x);).如果你想转换一个荷兰语(好吧,不仅是荷兰语,让我们说大陆欧洲)格式化的值,它应该是一个String.你可以写一个String原型的扩展,如:

String.prototype.toFloat = function(){
      return parseFloat(this.replace(/,(\d+)$/,'.$1'));
};
//usage
'7,75'.toFloat()+'7,75'.toFloat(); //=> 15.5
Run Code Online (Sandbox Code Playgroud)


OXi*_*GEN 5

扩展@naitsirch 的解决方案,我们可以使用Intl.NumberFormat.formatToParts()让 JS 解析组和小数分隔符。

function parseLocaleNumber(stringNumber) {
  let num = 123456.789,
    fmt_local = new Intl.NumberFormat(),
    parts_local = fmt_local.formatToParts(num),
    group = '',
    decimal = '';

  parts_local.forEach(function(i) {
    switch (i.type) {
      case 'group':
        group = i.value;
        break;
      case 'decimal':
        decimal = i.value;
        break;
      default:
        break;
    }
  });

  return parseFloat(stringNumber
    .replace(new RegExp('\\' + group, 'g'), '')
    .replace(new RegExp('\\' + decimal), '.')
  );
}

//replace this string with a number formatted for your locale
console.log(parseLocaleNumber("987,654,321.01"));
//output for "en" locale: 987654321.01
Run Code Online (Sandbox Code Playgroud)