Qu'est-ce que le symbole de séparateur décimal dans JavaScript?

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

en fin de Compte, j'aimerais écrire du code qui supporte les deux points décimaux dans l'entrée de l'utilisateur - spécifiques à une culture et . , mais je ne peux pas écrire un tel code si je ne sais pas ce que JavaScript attend.

, a Ajouté: OK, Rubens Farias suggère regarder la même question qui a fait un joli accepté de répondre:

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

c'est bien, ça me permet d'avoir la décimale locale. Un pas vers la solution, sans doute.

maintenant, le reste une partie serait de déterminer ce que le comportement de .parseFloat() est. Plusieurs réponses indiquent que pour les lettres flottantes seulement . est valable. Est-ce que .parseFloat() agit de la même façon? Ou pourrait-il nécessiter le séparateur décimal local dans un navigateur? Existe-il des méthodes différentes pour l'analyse des nombres à virgule flottante? Dois-je déployer mes propres juste pour être sûr?

41
demandé sur Community 2010-01-18 13:23:45

3 réponses

selon le cahier des charges, Un décimal est défini comme suit:

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

et pour satisfaire l'argument de parseFloat:

  1. Laissez inputString être ToString(string).
  2. que trimmedString soit un substrat de inputString composé du caractère le plus à gauche qui n'est pas un StrWhiteSpaceChar et de tous les caractères à la droite de ce caractère.(En d'autres termes, supprimer l'espace blanc.)
  3. Si Ni le trimmedString ni aucun préfixe de trimmedString ne satisfait à la syntaxe D'un StrDecimalLiteral (voir 9.3.1), retourner NaN.
  4. Laissez numberString être le plus long préfixe de trimmedString, qui pourrait être trimmedString lui-même, qui répond à la syntaxe d'un StrDecimalLiteral.
  5. retourner la valeur du nombre pour le MV

ainsi numberString devient le préfixe le plus long de la chaîne qui satisfait le syntaxe D'un StrDecimalLiteral, ce qui signifie le premier nombre de chaîne de caractères 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érentes locales, utilisez une chaîne remplacer:

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 , tandis que l'utilisation de l'opérateur unaire +"1ABC" renvoie NaN . Il est donc beaucoup plus facile de valider l'entrée. L'utilisation de parseFloat ne fait que supposer que l'entrée est dans le bon format.

19
répondu Andy E 2010-11-30 17:57:00

utiliser:

theNumber.toLocaleString();

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

10
répondu jspcal 2010-01-18 10:30:32

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 les choses DE JS est d'accord:

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

2
répondu Matt Sach 2010-01-18 10:29:54