JavaScript中区分区域性的ParseFloat函数?
有没有人建议用JavaScript编写区分区域性的ParseFloat函数,这样当我使用美国区域性格式的字符串100000.22时,parse float函数将返回100000.22,而如果在瑞典区域性中输入100.000,22,它将返回100000.22 float?这有点粗糙,但可能已经足够了,允许您传入千位和十进制分隔符:JavaScript中区分区域性的ParseFloat函数?,javascript,cultureinfo,Javascript,Cultureinfo,有没有人建议用JavaScript编写区分区域性的ParseFloat函数,这样当我使用美国区域性格式的字符串100000.22时,parse float函数将返回100000.22,而如果在瑞典区域性中输入100.000,22,它将返回100000.22 float?这有点粗糙,但可能已经足够了,允许您传入千位和十进制分隔符: function parseFloatOpts(num, decimal, thousands) { var bits = num.split(decimal,
function parseFloatOpts(num, decimal, thousands) {
var bits = num.split(decimal, 2),
ones = bits[0].replace(new RegExp('\\' + thousands, 'g'), '');
ones = parseFloat(ones, 10),
decimal = parseFloat('0.' + bits[1], 10);
return ones + decimal;
}
示例:
parseFloatOpts("100.000,22", ',', '.'); //100000.22
parseFloatOpts("100,000.22", '.', ','); //100000.22
请注意,这并不能确保千位分隔符确实代表千位,等等,或者根据功能的重要性执行许多其他您可能希望执行的保护操作
var parse = function(st){
if(st.indexOf(",") === st.length-3){
st = st.replace(".", "").replace(",", ".");
}else{
st = st.replace(",", "");
}
return parseFloat(st, 10)
}
console.log(parse("100,000.22")) // 100000.22
console.log(parse("100.000,22")) // 100000.22
我只是在检查倒数第三位是否有逗号。如果e不是逗号(例如100.000),则可以进一步细化该值,以检查从第4位到最后一位是否有一个句点。看着lonesomday,我产生了这样的想法: 你也可以这样做:
function parse (str)
var ar = str.split(/\.|,/);
return Number(ar[0]+ar[1]+"."+ar[3]);
这是一个粗略的函数。它将假定最后一个标点符号表示小数,无论是逗号、句点还是您可能需要指示的任何其他字符。然后从整数中删除其他标点符号。将其放回一起并解析为float
function normalizeFloat(number, chars) {
var lastIndex = -1;
for(i=0; i < chars.length; i++) {
t = number.lastIndexOf(chars[i]);
if (t > lastIndex) {
lastIndex = t;
}
}
if (lastIndex == -1) {
lastIndex = number.length;
}
var whole = number.substring(0, lastIndex);
var precision = number.substring(lastIndex);
for (i=0; i < chars.length; i++) {
whole = whole.replace(chars[i], '');
precision = precision.replace(chars[i],'.');
}
number = whole + precision;
f = parseFloat(number);
return f;
}
我改进了mwilcox函数,以使用分隔符处理值
function parseFloatOpts (str) {
if(typeof str === "number"){
return str;
}
var ar = str.split(/\.|,/);
var value = '';
for (var i in ar) {
if (i>0 && i==ar.length-1) {
value += ".";
}
value +=ar[i];
}
return Number(value);
}
需要使用区域性信息中的当前组和小数分隔符
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function parseFloatOpts(str, groupSeparator, decimalSeparator) {
if (typeof str === "number") {
return str;
}
var value = str.replace(new RegExp(escapeRegExp(groupSeparator), 'g'), "");
value = value.replace(decimalSeparator, ".");
return Number(value);
}
如果您真的希望在JavaScript的不同语言环境中显示和/或解析浮动(或日期、货币或更多),那么我建议使用GlobalizeJS()库
一开始设置起来有点困难(至少在我的经验中是这样),但完全建议对这件事进行适当的管理。我不知道这是否是一个文化问题,它是一个
,
问题。当我为ASP.Net应用程序编写解决方案时,我设法解决了我的问题,而没有为它编写任何自定义解决方案。因为MSDN库提供了JavaScript基本类型扩展方法,其中一种是数字类型扩展,它具有函数localeFormat和parseLocale。这些函数提供从/到十进制格式w.r.t区域性的转换。您也可以从服务器设置区域性,否则这些函数将使用默认区域性。请参阅此链接。在我的例子中,我必须设置sv SE,因为我需要使用瑞典文化来形成数字。对于数千个分隔符的可变数字,这可能会重复。谢谢你的回答,我能够在ASP.Net中解决这个问题。请参阅我的原始帖子中的上述回复。
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function parseFloatOpts(str, groupSeparator, decimalSeparator) {
if (typeof str === "number") {
return str;
}
var value = str.replace(new RegExp(escapeRegExp(groupSeparator), 'g'), "");
value = value.replace(decimalSeparator, ".");
return Number(value);
}