Sto cercando di analizzare due valori da un datagrid. I campi sono numerici e quando hanno una virgola (es. 554,20), non riesco a ottenere i numeri dopo la virgola. Ho provato parseInt
e parseFloat
. Come posso fare questo?
Sto cercando di analizzare due valori da un datagrid. I campi sono numerici e quando hanno una virgola (es. 554,20), non riesco a ottenere i numeri dopo la virgola. Ho provato parseInt
e parseFloat
. Come posso fare questo?
Risposte:
Se devono essere valori separati, prova questo:
var values = "554,20".split(",")
var v1 = parseFloat(values[0])
var v2 = parseFloat(values[1])
Se intendono essere un valore singolo (come in francese, dove la metà è scritta 0,5)
var value = parseFloat("554,20".replace(",", "."));
+(string)
invece parseString(string)
come suggerito da @Stev di seguito. Quindi, il primo esempio sarebbe v1 = +(values[0]); v2 = +(values[1]);
.
6.000.000
. La funzione di sostituzione sostituisce solo il primo separatore di virgola
Hai mai provato a farlo? : p
var str = '3.8';ie
alert( +(str) + 0.2 );
+ (stringa) lancerà la stringa in float.
Maneggevole!
Quindi, al fine di risolvere il tuo problema, puoi fare qualcosa del genere:
var floatValue = +(str.replace(/,/,'.'));
+(str)
soluzione: parseFloat
ignora i caratteri non validi dopo il numero, +(str)
ritorna NaN
in quei casi, che è esattamente ciò di cui ho bisogno.
Sostituisci la virgola con un punto.
Questo restituirà solo 554:
var value = parseFloat("554,20")
Ciò restituirà 554.20:
var value = parseFloat("554.20")
Quindi, alla fine, puoi semplicemente usare:
var fValue = parseFloat(document.getElementById("textfield").value.replace(",","."))
Non dimenticare che parseInt()
dovrebbe essere utilizzato solo per analizzare numeri interi (senza punti mobili). Nel tuo caso restituirà solo 554. Inoltre, chiamare parseInt () su un float non arrotonderà il numero: prenderà il suo piano (intero inferiore più vicino).
Esempio esteso per rispondere alla domanda di Pedro Ferreira dai commenti:
Se il campo di testo contiene migliaia di punti di separazione come 1.234.567,99
quelli che potrebbero essere eliminati in anticipo con un altro replace
:
var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))
Se estendi l'oggetto String in questo modo ...
String.prototype.float = function() {
return parseFloat(this.replace(',', '.'));
}
.. puoi eseguirlo in questo modo
"554,20".float()
> 554.20
funziona anche con punto
"554.20".float()
> 554.20
typeof "554,20".float()
> "number"
@GusDeCool o chiunque altro cercando di sostituire più di un separatori di migliaia, un modo per farlo è una regex sostituzione globale: /foo/g
. Ricorda solo che si .
tratta di un metacarattere, quindi devi evitarlo o metterlo tra parentesi ( \.
o [.]
). Ecco un'opzione:
var str = '6.000.000';
str.replace(/[.]/g,",");
Puoi usare questa funzione. Sostituirà le virgole con '' e quindi analizzerà il valore e successivamente modificherà 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;
}
Ho avuto lo stesso problema, tranne per il fatto che non sapevo in anticipo quali fossero i separatori delle migliaia e il separatore decimale. Ho finito per scrivere una biblioteca per fare questo. Se ti interessa qui è: https://github.com/GuillaumeLeclerc/number-parsing
Provare
let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);
console.log({float,int});