43 votes

Quel est le symbole du séparateur décimal en JavaScript ?

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

En fin de compte, j'aimerais écrire un code qui prend en charge les deux points décimaux dans la saisie de l'utilisateur - spécifique à une 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 à regarder question similaire qui a une réponse claire et acceptée :

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

C'est bien, ça me permet d'avoir le point décimal de la locale. Un pas vers la solution, sans doute.

Maintenant, la partie restante serait de déterminer quel est le comportement de .parseFloat() est. Plusieurs réponses soulignent que pour les littéraux en virgule flottante, seuls les éléments suivants peuvent être utilisés . est valable. Est-ce que .parseFloat() agissent de la même manière ? Ou bien le séparateur décimal local est-il nécessaire dans certains navigateurs ? Existe-t-il également des méthodes différentes pour analyser les nombres à virgule flottante ? Devrais-je mettre en place ma propre méthode pour être sûr ?

21voto

Andy E Points 132925

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

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

et pour satisfaire l'argument parseFloat :

  1. Laissez inputString être ToString(string).
  2. Soit trimmedString une sous-chaîne de inputString constitué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, supprimer l'espace blanc de tête).
  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 plus long préfixe de trimmedString, qui peut être trimmedString lui-même, qui satisfait à la syntaxe d'un StrDecimalLiteral.
  5. Renvoie la valeur du nombre pour le MV

Ainsi, numberString devient le plus long préfixe 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. Seuls les . peut être utilisé pour spécifier un nombre à virgule flottante. Si vous acceptez des entrées provenant de différentes langues, 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 qu'en utilisant l'opérateur unaire +"1ABC" renvoie à NaN . Il est ainsi BEAUCOUP plus facile de valider l'entrée. Utiliser parseFloat revient à supposer que l'entrée est au bon format.

12voto

jspcal Points 20715

Utiliser :

theNumber.toLocaleString();

pour obtenir une chaîne correctement formatée avec les bons séparateurs de décimales et de milliers.

2voto

Matt Sach Points 992

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

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

1voto

Rubens Farias Points 33357

Jetez un coup d'œil à cette question : Avec un navigateur, comment savoir quel séparateur décimal le client utilise-t-il ?

C'est une façon intelligente

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X