J'ai 2,299.00
une chaîne et j'essaye de l'analyser en un nombre. J'ai essayé d'utiliser parseFloat
, ce qui donne 2. Je suppose que la virgule est le problème, mais comment résoudre ce problème de la bonne manière? Supprimez simplement la virgule?
var x = parseFloat("2,299.00")
alert(x);
javascript
number-formatting
user1540714
la source
la source
.replace(/,/g, '')
Cette regex utilise le globalg
pour remplacer tout.parseFloat("2,000,000.00".replace(',',''))
retours2000
et 2. il échoue dans de nombreuses régions du monde où se,
trouve une décimale, par exemple lesparseFloat("2.000.000,00".replace(',',''))
retours2
- voir ma réponse ci-dessous pour quelque chose qui fonctionne partout dans le monde.La suppression des virgules est potentiellement dangereuse car, comme d'autres l'ont mentionné dans les commentaires, de nombreux paramètres régionaux utilisent une virgule pour signifier quelque chose de différent (comme une décimale).
Je ne sais pas d'où tu as obtenu ta chaîne, mais dans certains endroits du monde
"2,299.00"
=2.299
L'
Intl
objet aurait pu être un bon moyen de résoudre ce problème, mais d'une manière ou d'une autre, ils ont réussi à expédier la spécification avec seulement uneIntl.NumberFormat.format()
API et aucuneparse
contrepartie :(La seule façon d'analyser une chaîne contenant des caractères numériques culturels en un nombre reconnaissable par la machine d'une manière sensée i18n est d'utiliser une bibliothèque qui exploite les données CLDR pour couvrir toutes les manières possibles de formater les chaînes numériques http: //cldr.unicode. org /
Les deux meilleures options JS que j'ai rencontrées pour cela jusqu'à présent:
la source
Sur les navigateurs modernes, vous pouvez utiliser l' Intl.NumberFormat intégré pour détecter le formatage des nombres du navigateur et normaliser l'entrée pour qu'elle corresponde.
Il y a évidemment place pour une optimisation et une mise en cache, mais cela fonctionne de manière fiable dans toutes les langues.
la source
Supprimez tout ce qui n'est pas un chiffre, un point décimal ou un signe moins (
-
):Violon mis à jour
Notez que cela ne fonctionnera pas pour les nombres en notation scientifique. Si vous le souhaitez, changer la
replace
ligne à ajoutere
,E
et+
à la liste des caractères acceptables:la source
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
C'est ce que j'utiliserais, mais je suis totalement inutile à regex et c'est quelque chose que j'ai trouvé il y a quelque temps sur un autre fil SO.parseFloat
- ce qui le validera. :-)Vous devriez généralement envisager d'utiliser des champs de saisie qui n'autorisent pas la saisie de texte libre pour les valeurs numériques. Mais il peut y avoir des cas où vous devez deviner le format d'entrée. Par exemple, 1,234,56 en Allemagne signifie 1 234,56 aux États-Unis. Voir https://salesforce.stackexchange.com/a/21404 pour une liste des pays qui utilisent la virgule comme décimal.
J'utilise la fonction suivante pour faire une meilleure estimation et supprimer tous les caractères non numériques:
Essayez-le ici: https://plnkr.co/edit/9p5Y6H?p=preview
Exemples:
La fonction a un point faible: il n'est pas possible de deviner le format si vous avez 1,123 ou 1,123 - parce que selon le format local, les deux peuvent être une virgule ou un séparateur de milliers. Dans ce cas particulier, la fonction traitera le séparateur comme un séparateur de milliers et retournera 1123.
la source
3,00 €
il est également remplacé par 3.00. Juste une note, qui3,001
est formatée en3001
. Pour éviter cela, l'entrée doit toujours être avec des symboles décimaux. Par exemple,3,001.00€
3,001.00
convertit correctement. Veuillez également mettre à jour jsfiddle.0,124
il est encore converti en 124Il est déconcertant qu'ils aient inclus un toLocaleString mais pas une méthode d' analyse . Au moins toLocaleString sans arguments est bien pris en charge dans IE6 +.
Pour une solution i18n , j'ai proposé ceci:
Commencez par détecter le séparateur décimal des paramètres régionaux de l'utilisateur:
Puis normalisez le nombre s'il y a plus d'un séparateur décimal dans la chaîne:
Enfin, supprimez tout ce qui n'est pas un nombre ou un séparateur décimal:
la source
Il s'agit d'un wrapper simpliste et discret autour de la
parseFloat
fonction.la source
Si vous voulez éviter le problème que David Meister a posté et que vous êtes sûr du nombre de décimales, vous pouvez remplacer tous les points et virgules et diviser par 100, ex .:
ou si vous avez 3 décimales
C'est à vous de décider si vous souhaitez utiliser parseInt, parseFloat ou Number. Aussi, si vous souhaitez conserver le nombre de décimales, vous pouvez utiliser la fonction .toFixed (...).
la source
Toutes ces réponses échouent si vous avez un nombre de millions.
3 456 789 renverrait simplement 3456 avec la méthode de remplacement.
La réponse la plus correcte pour simplement supprimer les virgules devrait être.
Ou simplement écrit.
la source
Cela convertit un nombre de n'importe quel endroit en nombre normal. Fonctionne aussi pour les points décimaux:
la source
Avec cette fonction, vous serez en mesure de formater des valeurs dans plusieurs formats comme
1.234,56
et1,234.56
, et même avec des erreurs comme1.234.56
et1,234,56
la source
Si vous voulez une réponse l10n, faites-le de cette façon. L'exemple utilise la devise, mais vous n'en avez pas besoin. La bibliothèque Intl devra être polyfilled si vous devez prendre en charge des navigateurs plus anciens.
la source
replace()
remplace également la première correspondance lorsque vous ne l'utilisez pasRegExp
avec un'g'
indicateur.,
ce qui est dans un séparateur de virgule dans certains paramètres régionauxRemplacez la virgule par une chaîne vide:
la source
Si vous avez un petit ensemble de paramètres régionaux à prendre en charge, vous feriez probablement mieux de simplement coder en dur quelques règles simples:
la source
la source
La fonction split divise la chaîne en un tableau en utilisant "," comme séparateur et renvoie un tableau.
La fonction de jointure joint les éléments du tableau renvoyés par la fonction de fractionnement.
La fonction Number () convertit la chaîne jointe en un nombre.
la source