Comment convertir une chaîne en float en JavaScript?


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(",", "."));

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(/,/,'.'));

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(",","."))

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"

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,",");

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;
    }


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.