Question

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

J'ai déjà pensé à éliminer la virgule puis à analyser.

connaissez-vous une manière meilleure / propre?

merci

Était-ce utile?

La solution

Nope.Supprimer la virgule.

Autres conseils

parseFloat( theString.replace(/,/g,'') );

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 périodes.Vous n'avez pas besoin de fonctions / boucles personnalisées pour cela non plus, c'est juste une excédence.

Vous pouvez utiliser la méthode de remplacement de chaîne, mais pas dans une doublure en tant que régexpère.

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

ou pour faire une seule expression sans régexp=

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

J'utiliserais le regexp.

Je n'ai pas assez de réputation pour ajouter un commentaire, mais pour que quiconque se demande sur la performance de Regex vs Split / Rejoindre, voici un violon rapide: 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 chacune):

Regex: 263.335 MS
Split / Join: 1035.875 MS

Donc, je pense que c'est sûr de dire que Regex est la voie à suivre dans ce scénario

Immeuble sur l'idée de @kennnebec, si vous voulez vous assurer que les virgules sont correctes et que vous ne voulez pas remplacer des virgules, 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 :)

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 des valeurs à partir de champs (à l'aide de jQuery) en supposant que les valeurs entrées sont numériques (je valide plutôt les champs pendant la saisie des données, donc je sais que le contenu de votre champ est numérique).

En cas de valeurs à virgule flottante, si bien formaté dans le champ, la fonction retournera correctement une valeur de point flottante.

Cette fonction est loin d'être complète, mais elle corrige rapidement le problème ", " ( virgule ) pour les valeurs entrées sous la forme de 1 234.56 ou 1 234 567. Il retournera le numéro valide aussi loin que le contenu est numérique.

Le + ( plus ) en avant de la variable valeur dans le retour " / forte> commande est un " sale tour " utilisé dans JavaScript pour assurer que le contenu variable renvoyé sera numérique .

Il est facile de modifier la fonction à d'autres fins, telles que (par exemple), convertissez des chaînes à des valeurs numériques prenant soin de la ", " ( virgule ) Problème:

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

Les deux opérations peuvent même être combinées dans une seule fonction. I.e.:

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 la fonction est appelée résultat= parsenumber ('12, 092.98 '); il analysera la valeur telle qu'elle est une chaîne. Mais si appelé comme résultat= parsenumber ('# myfield', vrai); il tentera d'obtenir la valeur de '# myfield'

.

.

Comme je l'ai dit auparavant, de telles fonctions sont loin d'être complètes et peuvent être étendues à bien des égards. 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= '#' ID d'un objet DOM, sinon, s'il commence par un numéro, il doit s'agir d'une chaîne à analyser).

Essayez-le ... codage heureux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top