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?
Selon la spécification, un DecimalLiteral est défini comme:
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
et pour satisfaire l'argument parseFloat:
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.
utilisation:
theNumber.toLocaleString();
pour obtenir une chaîne correctement formatée avec la bonne décimale et des séparateurs de milliers
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: