2011-02-09 8 views
9

Czy ktoś ma sugestie dotyczące pisania wrażliwych na kulturę funkcji ParseFloat w JavaScript, Tak więc, gdy mam ciąg 100 000,22 w formacie kultury amerykańskiej, funkcja analizowania składni zwraca 100000.22, natomiast jeśli wprowadzę 100 000,22 w kulturze szwedzkiej, zwróci ona 100000.22 w float?Kulturowa funkcja ParseFloat w języku JavaScript?

+0

Nie wiem, czy to jest sprawa kultury, to jest rzecz. – Victor

+1

Kiedy pisałem rozwiązanie dla aplikacji ASP.Net, udało mi się rozwiązać mój problem, nie pisząc dla niego żadnego niestandardowego rozwiązania. Ponieważ biblioteka MSDN udostępnia metodę JavaScript Base Type Extensions, jedną z nich są rozszerzenia typu liczbowego, które mają funkcje localeFormat i parseLocale. Ta funkcja zapewnia konwersję z/do formatu dziesiętnego w.r.t. zobacz to jak http://msdn.microsoft.com/en-us/library/bb310835(v=VS.90).aspx. –

+0

Można również ustawić kulturę z serwera, w przeciwnym razie te funkcje będą używać domyślnej kultury. zobacz ten link http://msdn.microsoft.com/en-us/library/bz9tc508(v=VS.90).aspx. W moim przypadku muszę ustawić sv-SE, ponieważ muszę używać kultury szwedzkiej do formowania liczb. –

Odpowiedz

3

Jest to nieco szorstki i gotowe, ale może to być wystarczające, co pozwala przechodzić w tysiącach i separatorów dziesiętnych:

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

Przykłady:

parseFloatOpts("100.000,22", ',', '.'); //100000.22 
parseFloatOpts("100,000.22", '.', ','); //100000.22 

NB że ta nie zapewnia, że ​​separator tysięcy rzeczywiście reprezentuje tysiące itd. lub robi wiele innych zabezpieczeń, które możesz chcieć, w zależności od znaczenia funkcji.

+0

Dzięki za odpowiedź, jestem w stanie rozwiązać problem w ASP.Net. Zobacz moją powyższą odpowiedź w moim oryginalnym wpisie. –

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 

Właśnie sprawdzam, czy w pozycji trzeciej do ostatniej jest przecinek. To może być następnie rafinowana w celu sprawdzenia, czy nie jest to okres, w 4 do ostatniej pozycji w przypadku tobą jest nie przecinek (takich jak 100.000)

1

Patrząc na lonesomday dał mi tę myśl:

Można również zrobić :

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

Jak to działa dla zmiennej liczby separatorów tysięcy? – lonesomeday

0

Oto przybliżona funkcja. Przyjmie on ostatnią interpunkcję, aby wskazać miejsca dziesiętne, bez względu na to, czy jest to przecinek, kropka, czy jakikolwiek inny znak, który należy wskazać. Następnie eliminuje inne znaki interpunkcyjne z całej liczby. Zrzuca je z powrotem i parsuje jako 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; 
} 

spróbuj tego:

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

Mam poprawie funkcji mwilcox”do obsługi wartości withous separatorów.

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