2011-02-09 67 views
9

有沒有人有寫JavaScript文化敏感的ParseFloat函數的建議,所以當我在美國文化格式的字符串100,000.22時,解析浮點函數返回100000.22,而如果我在瑞典文化中輸入100.000,22,它會返回100000.22的浮點數?JavaScript中的文化敏感ParseFloat函數?

+0

我不知道這是不是一種文化的東西,它是一種'東西'。 – Victor 2011-02-09 23:33:09

+1

當我爲ASP.Net應用程序編寫解決方案時,我設法解決了我的問題,而無需爲它編寫任何自定義解決方案。由於MSDN庫提供了JavaScript基本類型擴展方法,其中之一是數字類型擴展,它具有函數localeFormat和parseLocale。這些函數提供了從/到小數格式w.r.t文化的轉換。請參閱http://msdn.microsoft.com/en-us/library/bb310835(v=VS.90).aspx。 – 2011-02-10 22:26:32

+0

也可以從服務器設置文化,否則這些功能將使用默認文化。看到這個鏈接http://msdn.microsoft.com/en-us/library/bz9tc508(v=VS.90).aspx。在我的情況下,我必須設置sv-SE,因爲我需要使用瑞典文化來格式化數字。 – 2011-02-10 22:31:44

回答

3

這是一個有點粗糙和準備,但它可能是足夠的,讓您在數千小數點分隔符傳:

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 

NB,這並不能確保千位分隔符確實代表數千等等,或者根據功能的重要性做許多其他的保護措施,您可能希望這樣做。

1
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 

我只是檢查是否在第三個位置有一個逗號。這可以進一步改進,以檢查是否有在4日到的情況下你最後一個位置的期間,沒有逗號(如100.000)

1

看着lonesomday的給了我這個念頭:

你也可以做:

function parse (str) 
    var ar = str.split(/\.|,/); 
    return Number(ar[0]+ar[1]+"."+ar[3]); 
0

這是一個粗略的功能。它將假定最後一個標點符號來表示小數,無論是逗號,句點還是其他可能需要表示的字符。然後從整個數字中刪除其他標點符號。將它放回到一起,並解析爲浮動。

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; 
} 

試試這個:

alert(normalizeFloat('12.345,77', [',','.']).toFixed(2)); 
alert(normalizeFloat('12,345.77', [',','.']).toFixed(2)); 
6

我已經改善mwilcox」功能來處理價值withous分隔符。

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); 
}