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

JavaScript是否考虑了本地小数分隔符?,javascript,localization,Javascript,Localization,我有一个网页,以用户的本地化格式显示小数,如下所示: 中文:7.75 荷兰语:7,75 如果我在我的机器上用JavaScript将两个数字变量加在一起(数字取自上述格式的字符串),我会得到以下结果: 中文:7.75+7.75=15.5 荷兰语:7,75+7,75=0 如果我要在Dutch users机器上运行此代码,我是否应该期望英语格式的加法返回0,而荷兰格式的加法返回15,5 简言之:JavaScript计算在字符串到数字的转换中是否使用了局部小数分隔符?否,分隔符在JavaScri

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

  • 中文:
    7.75
  • 荷兰语:
    7,75
如果我在我的机器上用JavaScript将两个数字变量加在一起(数字取自上述格式的字符串),我会得到以下结果:

  • 中文:
    7.75+7.75=15.5
  • 荷兰语:
    7,75+7,75=0
如果我要在Dutch users机器上运行此代码,我是否应该期望英语格式的加法返回
0
,而荷兰格式的加法返回
15,5


简言之:JavaScript计算在字符串到数字的转换中是否使用了局部小数分隔符?

否,分隔符在JavaScript
数字中始终是一个点(.)。因此
7,75
的计算结果为
75
,因为
调用从左到右的计算(在控制台中尝试:
x=1,x+=1,警报(x)
,或更多到
var x=(7,75);警报(x);
)。如果要转换荷兰语格式的值(不仅仅是荷兰语,比方说欧洲大陆),它应该是
字符串
。您可以为
字符串
原型编写一个扩展,如下所示:

String.prototype.toFloat = function(){
      return parseFloat(this.replace(/,(\d+)$/,'.$1'));
};
//usage
'7,75'.toFloat()+'7,75'.toFloat(); //=> 15.5
注意,如果浏览器支持,您可以使用
Number.toLocaleString

console.log((3.32).toLocaleString(“nl-nl”);
console.log((3.32).tolocalesting(“英国”)
。作为控制台包装{top:0;最大高度:100%!important;}
否,逗号(
)是一个具有特殊含义的运算符,就像点(
)一样。否则事情就很简单:

var array1 = [1,2];
var array2 = [1.2];

将在不同的地区中断。我所知道的所有主流语言都将
分别严格地对待,而不考虑语言环境。

不,十进制分隔符在JavaScript中根本没有本地化,parseFloat()解析数字的格式与您在JavaScript源代码中需要使用的格式相同:“.”作为十进制分隔符,没有组(千)分隔符,“E”或“E”表示“十次方”符号,Ascii连字符“-”表示减号


要以本地化格式读取或写入数字,您还需要一些其他的东西。我建议使用Globalize.js库,除非您可以将自己限制在十进制分隔符的单一问题上,并且在这种情况下使用有限的语言,否则只需执行映射“To”的字符串操作可能会更简单输出时,反之亦然。

以下是区域设置识别数字解析器的示例:

function parseLocaleNumber(stringNumber, locale) {
    var thousandSeparator = Intl.NumberFormat(locale).format(11111).replace(/\p{Number}/gu, '');
    var decimalSeparator = Intl.NumberFormat(locale).format(1.1).replace(/\p{Number}/gu, '');

    return parseFloat(stringNumber
        .replace(new RegExp('\\' + thousandSeparator, 'g'), '')
        .replace(new RegExp('\\' + decimalSeparator), '.')
    );
}
它使用传递的区域设置(如果区域设置参数未定义,则使用浏览器的当前区域设置)替换千位和十进制分隔符

使用德语区域设置

var n = parseLocaleNumber('1.000.045,22');
n
将等于
1000045.22

更新:

  • 通过使用正则表达式类
    \p{Number}
    删除数字,解决了Pointy的评论。因此它也适用于非阿拉伯数字
  • 解决了Orion Adrian的评论,以支持数字每隔四位数分隔的语言
  • 添加了locale参数以指定不同的locale进行解析

扩展@naitsirch的解决方案,我们可以使用JS解析组和十进制分隔符

函数parseLocaleNumber(stringNumber){
设num=123456.789,
fmt_local=新的国际编号格式(),
parts_local=fmt_local.formatToParts(num),
组=“”,
十进制='';
局部forEach(功能(i)部分{
开关(i型){
案例“组”:
组=i.值;
打破
“十进制”大小写:
十进制=i.值;
打破
违约:
打破
}
});
返回parseFloat(stringNumber
.replace(新的RegExp('\\'+组'g'),'')
.replace(新的RegExp('\\'+十进制),'.'))
);
}
//将此字符串替换为针对您的区域设置格式化的数字
log(parseLocaleNumber(“987654321.01”);

//“en”语言环境的输出:987654321.01
考虑到符号,这在所有情况下都有效:

parseLocaleNumber: function ( stringNumber ) 
{
    let thousandSeparator = (11111).toLocaleString().replace(/1/g, '');
    let decimalSeparator = (1.1).toLocaleString().replace(/1/g, '');
    let symbol = (0).toLocaleString()
        .replace(/0/g, '')
        .replace(new RegExp('\\' + decimalSeparator), '.')
        .trim();

    return parseFloat(
        stringNumber
            .replace(new RegExp('\\' + thousandSeparator, 'g'), '')
            .replace(new RegExp('\\' + decimalSeparator), '.')
            .replace(new RegExp( symbol ), '')
    );
}
2突出显示的细节:

  • 使用11111而不是1111,因为默认情况下第一个始终显示千分隔符
  • 数字格式始终使用“.”作为十进制分隔符

  • 扩展@OXiGEN的解决方案,我们还可以使用它提取货币符号:)

    函数parseLocaleNumber(stringNumber、locale、currency\u代码){
    设num=123456.789,
    fmt_local=新的国际编号格式(语言环境{
    风格:“货币”,
    货币:货币代码
    }),
    parts_local=fmt_local.formatToParts(num),
    组=“”,
    十进制=“”,
    货币='';
    //分离器
    局部forEach(功能(i)部分{
    //log(i.type+':'+i.value);
    开关(i型){
    案例“组”:
    组=i.值;
    打破
    “十进制”大小写:
    十进制=i.值;
    打破
    “货币”一案:
    货币=i.价值;
    打破
    违约:
    打破
    }
    });
    返回parseFloat(stringNumber
    .replace(新的RegExp('\\'+组'g'),'')
    .replace(新的RegExp('\\'+十进制),'.'))
    .replace(新的RegExp('\\'+货币'g'),'')
    );
    }
    //将输入替换为针对您的区域设置、区域设置代码和货币代码格式化的数字
    log(parseLocaleNumber('987654321.01','en','USD');
    
    //“en”语言环境和“USD”的输出code:987654321.01
    7,75+7,75
    应该实际返回
    75
    @Amberlamps:我不确定我想知道为什么…我想知道,为什么
    7,75+7,75
    在您的情况下返回
    0
    。如果
    7,75
    是字符串,它应该返回
    7757,75
    。如果它都是整数,它应该返回
    75
    代码正在退出,将我的变量的初始值设置为
    0
    “Continental European”,这不是不可想象的<