2009-03-13 11 views
194

Sto cercando di analizzare due valori da un datagrid.
I campi sono numerici e quando hanno una virgola (ad esempio 554,20), non riesco a ottenere i numeri dopo la virgola.
Ho provato parseInt e parseFloat. Come posso fare questo?Come convertire la stringa in float in JavaScript?

+0

** vedi anche: ** http://stackoverflow.com/questions/24318654 – dreftymac

risposta

285

Se sono destinate ad essere separare i valori, provate questo:

var values = "554,20".split(",") 
var v1 = parseFloat(values[0]) 
var v2 = parseFloat(values[1]) 

Se sono destinate ad essere un singolo valore (come in francese, in cui la metà è scritto 0,5)

var value = parseFloat("554,20".replace(",", ".")); 
+6

E dove si usa una virgola come mille separatore? E.g. 1234 scritto come 1.234 –

+6

Si potrebbe semplicemente rimuovere la virgola, quindi analizzarla. (ad esempio, sostituirlo con "") –

+6

non è molto sicuro, come sconto = parseFloat ("5,, 5" .replace (",", ".")); ritorna 5 che porta a credere che sia un numero valido, ma perdi la parte .5 o potresti considerare che non è un numero valido – max4ever

26

Sostituire la virgola con un punto.

Questo sarà solo tornare 554:

var value = parseFloat("554,20") 

Ciò restituirà 554,20:

var value = parseFloat("554.20") 

Così, alla fine, si può semplicemente utilizzare:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",",".")) 

Non dimenticare che parseInt() debba essere utilizzato solo per analizzare gli interi (senza virgola mobile). Nel tuo caso restituirà solo 554. Inoltre, chiamare parseInt() su un float non arrotonderà il numero: prenderà il suo piano (il più basso numero intero più vicino).

+0

E il "" separatore di migliaia? Come 4.554,20 cosa tornerebbe ...? –

42

Avete mai provato a farlo? : p

var str = '3.8';ie 
alert(+(str) + 0.2); 

+ (stringa) esegue il cast della stringa.

Handy!

Quindi, al fine di risolvere il problema, si può fare qualcosa di simile:

var floatValue = +(str.replace(/,/,'.')); 
+6

Mi piace molto la soluzione '+ (str)' - 'parseFloat' ignora i caratteri non validi dopo il numero,' + (str) 'restituisce' NaN' in questi casi, che è esattamente quello di cui ho bisogno. – Alex

+0

Questa sembra essere la risposta migliore, simile al cast di un int cambiando il segno due volte con ~, come in ~~ "45.2" = 45 –

13

Se si estende oggetto String come questo ..

String.prototype.float = function() { 
    return parseFloat(this.replace(',', '.')); 
} 

.. si può eseguire in questo modo

"554,20".float() 
> 554.20 

opere con dot così

"554.20".float() 
> 554.20 

typeof "554,20".float() 
> "number" 
+7

Anche se di solito è considerata una cattiva forma modificare i prototipi dell'oggetto base. Cosa accadrebbe se anche un altro framework provasse a farlo, ma la funzionalità era diversa? – phreakhead

2

@GusDeCool o chiunque altro provi a sostituire più di mille separatori, un modo per farlo è una sostituzione globale regolare: /foo/g. Ricorda che . è un metacarattere, quindi devi scappare o metterlo tra parentesi (\. o [.]). Ecco una sola opzione:

var str = '6.000.000'; 
str.replace(/[.]/g,","); 
+1

sì, una sostituzione senza regex sostituisce solo un'occorrenza del carattere. – Aukhan

0

Ho avuto lo stesso problema, tranne che non sapevo in anticipo quali sono stati i separatori delle migliaia e il separatore decimale. Ho finito per scrivere una biblioteca per farlo. Se siete interessati, ecco: https://github.com/GuillaumeLeclerc/number-parsing

3

È possibile utilizzare questa funzione.Sostituirà le virgole con '' e quindi analizzerà il valore e dopo di ciò regolerà nuovamente le virgole in valore.

function convertToFloat(val) { 
     if (val != '') { 
      if (val.indexOf(',') !== -1) 
       val.replace(',', ''); 
      val = parseFloat(val); 
      while (/(\d+)(\d{3})/.test(val.toString())) { 
       val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2'); 
      } 
     } 
     return val; 
    } 
Problemi correlati