Conversione di una Stringa con il punto o la Virgola come separatore decimale il numero in JavaScript

Un elemento di input contiene numeri in cui la virgola o il punto è usato come separatore decimale e lo spazio può essere utilizzato per raggruppare migliaia di simile a questo:

‘1,2’
‘110 000,23’
E ‘100 1.23’

Come uno li converte un numero decimale nel browser con JavaScript?

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

InformationsquelleAutor Andrus | 2011-09-15

 

8 Replies
  1. 44

    Fare a sostituire la prima:

    parseFloat(str.replace(',','.').replace(' ',''))
    • Questo ignora completamente il fatto che , è spesso usato come separatore delle migliaia (raggruppamento). Se si utilizza un numero come 1,000,000.00 si ottiene 1, che è ovviamente del tutto sbagliato.
    • Si supponga che il suo codice verrà eseguito in IT cultura, ma se i dati di input da persone che utilizzano cioè, francese, danese, finlandese, ceco, ecc. lingua, ci sarà nessuna confusione. Tutto dipende l’utilizzo del codice
    • Non sto supponendo che a tutti. La maggior parte se non tutte le lingue/regioni raggruppamento delle cifre di qualche descrizione. Il carattere utilizzato varia (ad esempio [ .,']). Sto sottolineando il fatto che questo codice è di ignorare un enorme quantità di input che sarà corretto con nessun avviso in risposta (e nessun modo per sapere che è successo). Anche se le lingue non hanno questo problema, che non nega il fatto che in varie varie lingue avrà questo problema. Nota che sarà altrettanto rotto se la lingua in questione utilizza . come il raggruppamento delle cifre carattere.
    • Non credo che questa soluzione funziona in molti casi.
    • Questa è la peggiore soluzione mai ho scoperto COSÌ, mai! COSÌ è comunità e ignora il fatto che una soluzione, anche se funziona per il po, di solito non è la risposta giusta. Se ho usato questa soluzione in un software finanziario, vorrei essere in prigione o essere ucciso da ora..
    • Si prega di non usarlo.
    • Penso che questa sia una risposta decente. Io odio quando un utente tenta di utilizzare un angolo casi a provare e rovinare una buona risposta che ha lavorato per qualcuno. Se il tuo cliente e dell’ambiente in grado di garantire, per esempio, che la cultura è IT o che non dati finanziari saranno convertiti come questo, che cosa è il grosso problema? È solo il codice “accettabile” se si tratta di un over-progettato coltellino Svizzero? Questo è davvero molto di un cattivo pezzo di codice che qualcuno avrebbe ucciso su di esso, @KemalEmin?

  2. 19

    La soluzione perfetta

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

    Questa verifica ref

    • Grazie. Questo non fornisce un’opzione per il check per la formattazione corretta quando si fa unformat, ma è una buona base di libreria per costruire quella funzionalità. Esempio di ambiguo risultato: jsfiddle.net/SkzYe
    • Per riferimento futuro, questa biblioteca è spostato a openexchangerates.github.io/accounting.js
  3. 16

    Mi rendo conto che sono in ritardo per la festa, ma io volevo una soluzione per questo che gestire correttamente il raggruppamento delle cifre, come pure i vari separatori decimali per le valute. Come nessuno di questi completamente coperto il mio caso d’uso ho scritto la mia soluzione che può essere utile ad 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);
    }

    Questo dovrebbe togliere tutti non cifre e quindi verificare se c’è stato un punto decimale (o virgola), seguita da due cifre e inserire il punto decimale, se necessario.

    Vale la pena notare che ho preso di mira questo in particolare per la valuta e, come tale, presuppone l’assenza di posizioni decimali o esattamente due. E ‘ molto difficile essere sicuri sul fatto che il primo potenziale punto decimale incontrato è un punto decimale o un raggruppamento cifre carattere (per esempio, 1.542 potrebbe essere 1542) a meno che non si conoscano le specifiche di localizzazione attuale, ma dovrebbe essere abbastanza facile da adattare a questo per il tuo specifico caso d’uso, cambiando \d{2}$ a qualcosa che sarà adeguatamente corrispondere a ciò che ci si aspetta dopo il punto decimale.

  4. 9

    Si potrebbe sostituire tutti gli spazi da una stringa vuota, tutti coma da punti e poi analizzarlo.

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

    Ho usato un’espressione regolare in primo per essere in grado di corrispondere tutti gli spazi, non solo il primo.

  5. 4

    Tutte le altre soluzioni è necessario conoscere il formato in anticipo. Ho bisogno di rilevare(!) il formato, in ogni caso, e questo è ciò che io alla fine con.

    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 sono i benvenuti.

    • Questa è un idea molto bella, se poteva essere fatto senza l’uso di account.js sarebbe una bella soluzione indipendente.
  6. -1

    Da numero a stringa monetaria è facile Numero.prototipo.toLocaleString. Tuttavia il rovescio sembra essere un problema comune. Il separatore delle migliaia e il punto decimale non può essere ottenuto in JS standard.

    In questa particolare domanda il separatore delle migliaia è uno spazio bianco " " ma in molti casi può essere un periodo "." e punto decimale può essere una virgola ",". Come in 1 000 000,00 o 1.000.000,00. Quindi, questo è come convertirlo in un vero e proprio numero in virgola mobile.

    JS:

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

    In modo che il sostituto di callback prende "1.000.000,00" e la converte in "1000000.00". Dopo di che + nella parte anteriore della stringa risultante costringe in un certo numero.

    Attualmente questa funzione è molto utile. Per esempio, se si sostituisce il p1 = "" parte con p1 = "," in funzione di callback, un ingresso di 1.000.000,00 sarebbe risultato 1,000,000.00

    • Sia "1 000 000,99" e "1 000 000.99" risultato in NaN. La sintassi anche una sorta di offuscare che p1 = e p2 = in realtà non fare nulla. I valori assegnati sono tornato perché è una singola istruzione freccia funzione, ma l’assegnazione è completamente inutile e rende solo più difficile da leggere.
    • Grazie per l’heads up.

Lascia un commento