Convertire la string con il puntino o la virgola come separatore decimale al numero in JavaScript

Un elemento di input contiene numbers a where viene utilizzato il comma o il punto come separatore decimale e lo spazio può essere utilizzato per raggruppare migliaia come questo:

'1,2'
'110 000,23'
'100 1.23'

Come li convertiresti in un numero di galleggiamento nel browser utilizzando JavaScript?

Sono utilizzati jQuery e jQuery UI. Number(string) restituisce NaN e parseFloat() ferma sul primo spazio o virgola.

Fare una sostituzione prima:

 parseFloat(str.replace(',','.').replace(' ','')) 

La soluzione perfetta

accounting.js è una piccola libreria JavaScript per la numerazione, il denaro e la formattazione di valuta.

Controllare questo per ref

Potresti sostituire tutti gli spazi con una string vuota, tutti i coma per punti e poi analizzarla.

 var str = "110 000,23"; var num = parseFloat(str.replace(/\s/g, "").replace(",", ".")); console.log(num); 

Ho usato una regex nella prima per essere in grado di abbinare tutti gli spazi, non solo il primo.

Mi rendo conto che sono in ritardo per la festa, ma ho voluto una soluzione per questo che gestisse correttamente il gruppo di cifre e separatori decimali diversi per le valute. Poiché nessuno di questi ha coperto completamente il mio caso d'uso, ho scritto la mia soluzione che potrebbe essere utile per gli altri:

 function parsePotentiallyGroupedFloat(stringValue) { stringValue = stringValue.trim(); var result = stringValue.replace(/[^0-9]/g, ''); if (/[,\.]\d{2}$/.test(stringValue)) { result = result.replace(/(\d{2})$/, '.$1'); } return parseFloat(result); } 

Ciò dovrebbe eliminare eventuali non cifre e quindi verificare se esiste un punto decimale (o virgola) seguito da due cifre e se necessario è necessario inserire il punto decimale.

Vale la pena notare che ho puntato questo specificamente per la valuta e come tale presuppone né punti decimali né esattamente due. È abbastanza difficile essere sicuri se il primo punto decimale potenziale riscontrato sia un punto decimale o un carattere di raggruppamento di numbers (ad esempio, 1.542 potrebbe essere 1542 ) a less che non conoscano le specifiche della locale corrente, ma dovrebbe essere abbastanza semplice da adattare questo al tuo caso di utilizzo specifico cambiando \d{2}$ in qualcosa che corrisponderà adeguatamente a quello che si prevede dopo il punto decimale.

Questa è la soluzione migliore

http://numeraljs.com/

 numeral().unformat('0.02'); = 0.02 

Che dire:

 parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.')); 

Tutte le altre soluzioni richiedono di conoscere il formato in anticipo. Ho dovuto rilevare (!) Il formato in each caso e questo è quello che concludo.

 function detectFloat(source) { let float = accounting.unformat(source); let posComma = source.indexOf(','); if (posComma > -1) { let posDot = source.indexOf('.'); if (posDot > -1 && posComma > posDot) { let germanFloat = accounting.unformat(source, ','); if (Math.abs(germanFloat) > Math.abs(float)) { float = germanFloat; } } else { // source = source.replace(/,/g, '.'); float = accounting.unformat(source, ','); } } return float; } 

Questo è stato testato con i seguenti casi:

  const cases = { "0": 0, "10.12": 10.12, "222.20": 222.20, "-222.20": -222.20, "+222,20": 222.20, "-222,20": -222.20, "-2.222,20": -2222.20, "-11.111,20": -11111.20, }; 

Suggerimenti benvenuti.

Dal numero alla string di valuta è facile tramite Number.prototype.toLocaleString . Tuttavia il contrario sembra essere un problema comune. Il separatore di migliaia e il punto decimale potrebbero non essere ottenuti nello standard JS.

In questa particolare domanda i separatori di migliaia sono uno spazio bianco " " ma in molti casi può essere un periodo "." e il punto decimale può essere una virgola "," . Ad esempio in 1 000 000,00 o 1.000.000,00 . Allora questo è come faccio a convertire in un numero appropriato di virgola mobile.

 var price = "1 000.000,99", value = +price.replace(/(\.|\s)|(\,)/g,(m,p1,p2) => p1 ? "" : "."); console.log(value);