2011-02-09 9 views
9

Qualcuno ha suggerimenti per scrivere la funzione ParseFloat sensibile alla cultura in JavaScript, in modo che quando ho una stringa 100.000.22 nel formato cultura USA la funzione parse float restituisce 100000.22 mentre se inserisco 100.000,22 nella cultura svedese restituisce 100.000.22 in float?Funzione ParseFloat sensibile alla cultura in JavaScript?

+0

Non so se questa è una cosa culturale, è una cosa ''. – Victor

+1

Mentre stavo scrivendo una soluzione per l'applicazione ASP.Net, sono riuscito a risolvere il mio problema senza scrivere alcuna soluzione personalizzata per questo. Poiché la libreria MSDN fornisce il metodo JavaScript Base Type Extensions, uno dei quali è Number Type Extensions che ha funzioni localiFormat e parseLocale. Questa funzione fornisce la conversione da/a formato decimale w.r.t culture. vedere questo come http://msdn.microsoft.com/en-us/library/bb310835(v=VS.90).aspx. –

+0

Inoltre si può impostare la cultura dal server altrimenti queste funzioni useranno la cultura di default. vedere questo collegamento http://msdn.microsoft.com/en-us/library/bz9tc508(v=VS.90).aspx. Nel mio caso devo impostare sv-SE, perché ho bisogno di usare la cultura svedese per formattare i numeri. –

risposta

3

Questo è un po 'rough-and-ready, ma può essere sufficiente, che consente di passare a migliaia e separatori decimali:

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

Esempi:

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

NB che questo non garantisce che il separatore di migliaia rappresenti davvero migliaia, ecc., o faccia molta altra protezione che potresti desiderare di fare, a seconda dell'importanza della funzione.

+0

Grazie per la tua risposta, sono in grado di risolvere il problema in ASP.Net. Vedi la mia risposta sopra nel mio post originale. –

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 

Sto solo controllando se c'è una virgola nella penultima posizione. Questo potrebbe essere ulteriormente raffinato per verificare se c'è un periodo nel 4 ° in ultima posizione nel caso di te è senza virgola (ad esempio 100.000)

1

Guardando lonesomday di mi ha dato questo pensiero:

Si potrebbe anche fare :

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

Come funzionerà per numeri variabili di migliaia di separatori? – lonesomeday

0

Ecco una funzione approssimativa. Assumerà l'ultima punteggiatura per indicare i decimali, sia che si tratti di una virgola, di un periodo o di qualsiasi altro carattere che potrebbe essere necessario indicare. Elimina quindi le altre punteggiature dall'intero numero. Lo rimette insieme e analizza come 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; 
} 

provare questo:

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

ho migliorato la funzione mwilcox' per gestire i valori separatori 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); 
} 
Problemi correlati