web-dev-qa-db-fra.com

javascript parseFloat '500,000' renvoie 500 quand j'ai besoin de 500000

Comment serait-ce une bonne façon de gérer cela?

J'ai déjà pensé à supprimer la virgule, puis à analyser pour flotter. 

Connaissez-vous un moyen meilleur/plus propre?

Merci

35
DanC

Nan. Retirez la virgule.

17
Matchu
parseFloat( theString.replace(/,/g,'') );
76
James

Je ne sais pas pourquoi personne n'a suggéré cette expression.

parseFloat( theString.replace(/[^\d\.]/g,'') );

Supprime tous les caractères non numériques à l'exception des points. Vous n'avez pas besoin de fonctions/boucles personnalisées pour cela non plus, c'est exagéré.

14
micah

Vous pouvez utiliser la méthode de remplacement de chaîne, mais pas dans une ligne, comme le permet une expression rationnelle.

while(str.indexOf(',')!=-1)str= str.replace(',','');
parseFloat(str);

Ou pour faire une seule expression sans regexp =

return parseFloat(str.split(',').join(''));

J'utiliserais l'expression rationnelle.

6
kennebec

Je n'ai pas assez de réputation pour ajouter un commentaire, mais si vous vous interrogez sur les performances de regex vs split/join, voici un rapide violon: https://jsfiddle.net/uh3mmgru/

var test = "1,123,214.19";

var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
    var a = parseFloat(test.replace(/,/g,''));
}
var t1 = performance.now();
document.write('Regex took: ' + (t1 - t0) + ' ms');
document.write('<br>')

var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
    var b = parseFloat(test.split(',').join(''));
}
var t1 = performance.now();
document.write('Split/join took: ' + (t1 - t0) + ' ms');

Les résultats que je reçois sont (pour 1 million de boucles chacun):

Expression régulière: 263,335 ms
Diviser/rejoindre: 1035.875 ms

Donc, je pense qu'il est prudent de dire que la regex est la voie à suivre dans ce scénario

2
Mogzol

Qu'en est-il d'une fonction simple pour résoudre la plupart des problèmes courants?

function getValue(obj) {
  Value = parseFloat( $(obj).val().replace(/,/g,'') ).toFixed(2);
  return +Value;
}

La fonction ci-dessus obtient les valeurs des champs (à l'aide de jQuery) en supposant que les valeurs entrées sont numériques (je valide plutôt les champs lorsque l'utilisateur entre des données, je sais donc que le contenu du champ est numérique).

Dans le cas de valeurs à virgule flottante, si elle est correctement formatée dans le champ, la fonction renverra correctement une valeur de point flottant. 

Cette fonction est loin d’être complète, mais elle résout rapidement le problème ", " ( - virgule ) pour les valeurs entrées comme 1 234,56 ou 1 234 567. Il retournera un numéro valide dans la mesure où le contenu est numérique.

Le signe + ( plus ) devant la variableValuedans la commande return est un "tour sale" utilisé en JavaScript pour assurez-vous que le contenu de la variable renvoyé sera numeric

il est facile de modifier la fonction à d'autres fins, telles que (par exemple), convertir des chaînes en valeurs numériques en prenant soin de la question ", " ( virgule ):

function parseValue(str) {
  Value = parseFloat( str.replace(/,/g,'') ).toFixed(2);
  return +Value;
}

Les deux opérations peuvent même être combinées en une seule fonction. C'est à dire.:

function parseNumber(item,isField=false) {
  Value = (isField) ? parseFloat( $(item).val().replace(/,/g,'') ).toFixed(2) : parseFloat( item.replace(/,/g,'') ).toFixed(2)
  return +Value;
}

Dans ce cas, si fonction est appelée result = parseNumber ('12, 092.98 '); il analysera la valeur car il s'agit d'une chaîne. Mais si appelé comme result = parseNumber ('# MyField', true); il essaiera d'obtenir la valeur de '#MyField' .

Comme je l'ai dit précédemment, ces fonctions sont loin d'être complètes et peuvent être étendues de nombreuses manières. Une idée est de vérifier le premier caractère du paramètre donné (chaîne) et de décider en fonction du format de chaîne où obtenir la valeur à analyser (si le premier caractère est = '#' alors il s'agit d'un ID provenant d'un Objet DOM, sinon, s'il commence par un nombre, il doit s'agir d'un string à analyser).

Essayez-le ... codage heureux. 

0
Julio Marchi

En vous appuyant sur l'idée de @kennebec, si vous voulez vous assurer que les virgules sont correctes et que vous ne voulez pas les remplacer, vous pouvez essayer quelque chose comme ceci:

function myParse(num) {
  var n2 = num.split(",")
  out = 0
  for(var i = 0; i < n2.length; i++) {
    out *= 1000;
    out += parseFloat(n2[i])
  }
  return out
}
alert(myParse("1,432,85"));
// Returns 1432085, as the comma is misplaced.

Ce n'est peut-être pas aussi rapide, mais vous vouliez des alternatives :)

0
bradlis7