web-dev-qa-db-fra.com

Qu'est-ce que le séparateur décimal en JavaScript?

Une pensée m'a frappé alors que j'écrivais un morceau de code JavaScript qui traitait des valeurs à virgule flottante. Quel est le symbole du point décimal en JavaScript? Est-ce toujours .? Ou est-ce spécifique à la culture? Et qu'en est-il de .toFixed() et .parseFloat()? Si je traite une entrée utilisateur, il est susceptible d'inclure le symbole de séparateur décimal spécifique à la culture locale.

En fin de compte, j'aimerais écrire du code qui prend en charge les deux décimales dans les entrées utilisateur - spécifiques à la culture et ., Mais je ne peux pas écrire un tel code si je ne sais pas ce que JavaScript attend.

Ajouté: OK, Rubens Farias suggère de regarder question similaire qui a une bonne réponse acceptée :

function whatDecimalSeparator() {
    var n = 1.1;
    n = n.toLocaleString().substring(1, 2);
   return n;
}

C'est bien, cela me permet d'obtenir le point décimal local. Un pas vers la solution, sans aucun doute.

Maintenant, la partie restante serait de déterminer quel est le comportement de .parseFloat(). Plusieurs réponses indiquent que pour les littéraux à virgule flottante, seul . Est valide. .parseFloat() agit-il de la même manière? Ou pourrait-il nécessiter le séparateur décimal local dans un navigateur? Existe-t-il également des méthodes différentes pour analyser les nombres à virgule flottante? Dois-je déployer mon propre juste pour être sûr?

43
Vilx-

Selon la spécification, un DecimalLiteral est défini comme:

DecimalLiteral ::
    DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 
    . DecimalDigits ExponentPartopt 
    DecimalIntegerLiteral ExponentPartopt

et pour satisfaire l'argument parseFloat:

  1. Laissez inputString être ToString (chaîne).
  2. Soit trimmedString une sous-chaîne de inputString composée du caractère le plus à gauche qui n'est pas un StrWhiteSpaceChar et de tous les caractères à droite de ce caractère (en d'autres termes, supprimez le premier espace blanc).
  3. Si ni trimmedString ni aucun préfixe de trimmedString ne satisfait la syntaxe d'un StrDecimalLiteral (voir 9.3.1), retournez NaN.
  4. Soit numberString le préfixe le plus long de trimmedString, qui peut être trimmedString lui-même, qui satisfait la syntaxe d'un StrDecimalLiteral.
  5. Renvoie la valeur numérique pour le MV

Ainsi, numberString devient le préfixe le plus long de trimmedString qui satisfait la syntaxe d'un StrDecimalLiteral, c'est-à-dire le premier numéro de chaîne littérale analysable qu'il trouve dans l'entrée. Seul le . Peut être utilisé pour spécifier un nombre à virgule flottante. Si vous acceptez des entrées de différents paramètres régionaux, utilisez une chaîne de remplacement:

function parseLocalNum(num) {
    return +(num.replace(",", "."));
}

La fonction utilise l'opérateur unaire au lieu de parseFloat car il me semble que vous voulez être strict sur l'entrée. parseFloat("1ABC") serait 1, alors que l'utilisation de l'opérateur unaire +"1ABC" renvoie NaN. Cela rend BEAUCOUP plus facile de valider l'entrée. Utiliser parseFloat suppose simplement que l'entrée est au format correct.

21
Andy E

utilisation:

theNumber.toLocaleString();

pour obtenir une chaîne correctement formatée avec la bonne décimale et des séparateurs de milliers

12
jspcal

Pour autant que je sache, javascript lui-même ne connaît que le . séparateur pour les décimales. Au moins une personne dont je fais confiance au jugement sur JS:

http://www.merlyn.demon.co.uk/js-maths.htm#DTS

2
Matt Sach