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
- 中文:
7.75+7.75=15.5
- 荷兰语:
7,75+7,75=0
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”,这不是不可想象的<