JavaScript Paysfloat '500 000' retourne 500 quand j'ai besoin de 500000
-
13-09-2020 - |
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
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
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 "
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
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=
Essayez-le ... codage heureux.