Comment convertir une chaîne en float en JavaScript?

255

J'essaie d'analyser deux valeurs d'une grille de données. Les champs sont numériques et lorsqu'ils ont une virgule (ex. 554,20), je ne peux pas obtenir les chiffres après la virgule. J'ai essayé parseIntet parseFloat. Comment puis-je faire ceci?

Kamil Kiełczewski
la source
voir aussi: stackoverflow.com/questions/24318654
dreftymac

Réponses:

371

S'ils sont censés être des valeurs distinctes, essayez ceci:

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

S'ils sont censés être une seule valeur (comme en français, où la moitié est écrite 0,5)

var value = parseFloat("554,20".replace(",", "."));
Jesse Rusak
la source
6
Et où avez-vous une virgule utilisée comme mille séparateurs? Par exemple 1234 écrit comme 1,234
Chris B
6
Vous pouvez simplement supprimer la virgule, puis l'analyser. (par exemple, remplacez-le par "")
Jesse Rusak
7
ce n'est pas très sûr, car sconto = parseFloat ("5,, 5" .replace (",", ".")); renvoie 5, menant à croire que c'est un nombre valide, mais vous perdez la partie 0,5 ou vous pourriez considérer que ce n'est pas un nombre valide
max4ever
1
@ max4ever Si vous craignez d'accepter silencieusement des numéros invalides, vous pouvez les utiliser +(string)au lieu de ce parseString(string)qui est suggéré par @Stev ci-dessous. Donc, le premier exemple serait v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak
1
FAIL, et si mon numéro est 6.000.000. Fonction remplacer uniquement remplacer le premier séparateur de virgules
GusDeCooL
55

Avez-vous déjà essayé de faire cela? : p

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

+ (chaîne) convertira la chaîne en flottant.

Pratique!

Donc, pour résoudre votre problème, vous pouvez faire quelque chose comme ceci:

var floatValue = +(str.replace(/,/,'.'));
Stev
la source
7
J'aime vraiment la +(str)solution - parseFloatignore les caractères invalides après le nombre, +(str)retourne NaNdans ces cas, ce qui est exactement ce dont j'ai besoin.
Alex
34

Remplacez la virgule par un point.

Cela ne retournera que 554:

var value = parseFloat("554,20")

Cela retournera 554.20:

var value = parseFloat("554.20")

Donc au final, vous pouvez simplement utiliser:

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

N'oubliez pas que cela parseInt()ne doit être utilisé que pour analyser des entiers (pas de virgule flottante). Dans votre cas, il ne renverra que 554. De plus, appeler parseInt () sur un flottant ne arrondira pas le nombre: il prendra son étage (entier inférieur le plus proche).


Exemple étendu pour répondre à la question de Pedro Ferreira à partir des commentaires:

Si le champ de texte contient des milliers de points de séparation comme 1.234.567,99ceux-ci, ils pourraient être éliminés au préalable avec un autre replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))
Wadih M.
la source
Que dire de la "." Séparateur de milliers? Comme 4.554,20 ce qui reviendrait ...?
Pedro Ferreira
16

Si vous étendez un objet String comme ceci ..

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

.. vous pouvez l'exécuter comme ceci

"554,20".float()
> 554.20

fonctionne aussi avec dot

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"
sobi3ch
la source
10
Bien qu'il soit généralement considéré comme une mauvaise forme de modifier les prototypes d'objets de base. Et si un autre framework essayait également de le faire mais que les fonctionnalités différaient?
phreakhead
3

@GusDeCool ou quelqu'un d' autre d' essayer de remplacer plus d'un séparateur de milliers, une façon de le faire est un remplacement global regex: /foo/g. N'oubliez pas qu'il .s'agit d'un métacaractère, vous devez donc y échapper ou le mettre entre crochets ( \.ou [.]). Voici une option:

var str = '6.000.000';
str.replace(/[.]/g,",");
Nick Benes
la source
1
oui, un remplacement sans expression régulière ne remplace qu'une seule occurrence du caractère.
aukhan
2

Vous pouvez utiliser cette fonction. Il remplacera les virgules par '' et ensuite il analysera la valeur et ensuite il ajustera à nouveau les virgules en valeur.

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;
    }
Muhammad Bilal
la source
0

J'ai eu le même problème sauf que je ne savais pas à l'avance quels étaient les séparateurs de milliers et le séparateur décimal. J'ai fini par écrire une bibliothèque pour ce faire. Si cela vous intéresse ici c'est: https://github.com/GuillaumeLeclerc/number-parsing

DARK_DUCK
la source
-1

Essayer

let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);

console.log({float,int});

Kamil Kiełczewski
la source