319 votes

Comment convertir une chaîne en nombre décimal en JavaScript ?

Je suis en train d'essayer de parser deux valeurs à partir d'une grille de données. Les champs sont numériques, et lorsqu'ils ont une virgule (par exemple 554,20), je n'arrive pas à obtenir les chiffres après la virgule. J'ai essayé parseInt et parseFloat. Comment puis-je faire cela?

0 votes

437voto

Jesse Rusak Points 33702

Si elles sont censées être des valeurs séparées, essayez ceci :

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

Si elles sont censées être une seule valeur (comme en français, où un demi est écrit 0,5)

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

6 votes

What about where you have a comma used as a thousand separator? E.g. 1234 written as 1,234

6 votes

Vous pourriez simplement supprimer la virgule, puis l'analyser. (par ex. la remplacer par "")

7 votes

Ce n'est pas très sûr, car sconto = parseFloat("5,,5".replace(",", ".")); renvoie 5, laissant penser qu'il s'agit d'un nombre valide, mais vous perdez la partie .5 ou vous pourriez considérer qu'il ne s'agit pas d'un nombre valide

64voto

Stev Points 189

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 nombre décimal.

Pratique!

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

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

8 votes

J'aime vraiment la solution +(str) - parseFloat ignore les caractères invalides après le nombre, +(str) renvoie NaN dans ces cas, ce qui est exactement ce dont j'ai besoin.

47voto

Wadih M. Points 5161

Remplacez la virgule par un point.

Cela ne renverra que 554 :

var value = parseFloat("554,20")

Cela renverra 554.20 :

var value = parseFloat("554.20")

Donc, à la fin, vous pouvez simplement utiliser :

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

N'oubliez pas que parseInt() ne devrait être utilisé que pour parser des entiers (pas de nombres à virgule flottante). Dans votre cas, cela ne renverra que 554. De plus, appeler parseInt() sur un flottant ne va pas arrondir le nombre : il prendra son plancher (entier le plus proche vers le bas).


Exemple étendu pour répondre à la question de Pedro Ferreira dans les commentaires :

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

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

0 votes

Que diriez-vous du séparateur de milliers "." ? Comme 4.554,20 quel serait le retour... ?

17voto

sobi3ch Points 192

Si vous étendez l'objet String de cette manière..

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

.. vous pouvez l'exécuter comme ceci

"554,20".float()
> 554.20

Fonctionne également avec le point

"554.20".float()
> 554.20

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

10 votes

Bien qu'il soit généralement considéré comme maladroit de modifier les prototypages d'objets de base. Que se passerait-il si un autre framework essayait également de le faire mais que la fonctionnalité était différente?

3voto

Nick Benes Points 123

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

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

1 votes

Oui, un remplacement sans regex ne remplace qu'une seule occurrence du caractère.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X