Qual é o símbolo do separador decimal em JavaScript?

Um pensamento me surpreendeu quando eu estava escrevendo um pedaço de código JavaScript que processou alguns valores de ponto flutuante. Qual é o símbolo do ponto decimal em JavaScript? É sempre . ? Ou é específico da cultura? E quanto a .toFixed() e .parseFloat() ? Se eu estiver processando uma input do usuário, é provável que inclua o símbolo do separador decimal específico da cultura local.

Por fim, gostaria de escrever código que suporte os dois pontos decimais na input do usuário – específico da cultura e . , mas não posso escrever esse código se não souber o que o JavaScript espera.

Adicionado: OK, Rubens Farias sugere que se olhe para uma questão semelhante que tenha uma resposta bem aceita:

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

Isso é bom, permite-me obter o ponto decimal da localidade. Um passo para a solução, sem dúvida.

Agora, a parte restante seria determinar qual é o comportamento de .parseFloat() . Várias respostas indicam que apenas para literais de ponto flutuante . é válido. O .parseFloat() age da mesma maneira? Ou pode exigir o separador decimal local em algum navegador? Existem methods diferentes para analisar números de ponto flutuante também? Devo fazer o meu próprio apenas para ter certeza?

De acordo com a especificação, um DecimalLiteral é definido como:

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

e para satisfazer o argumento parseFloat:

  1. Deixe inputString ser ToString (string).
  2. Deixe trimmedString ser uma substring de inputString consistindo no caracter mais à esquerda que não é um StrWhiteSpaceChar e todos os caracteres à direita desse caractere (em outras palavras, remova o espaço em branco inicial).
  3. Se nem trimmedString nem qualquer prefixo trimmedString satisfizer a syntax de um StrDecimalLiteral (consulte 9.3.1), retorne NaN.
  4. Seja numberString o prefixo mais longo de trimmedString, que pode ser o próprio trimmedString, que satisfaz a syntax de um StrDecimalLiteral.
  5. Retorna o valor numérico para o MV

Então numberString se torna o prefixo mais longo de trimmedString que satisfaz a syntax de um StrDecimalLiteral, significando o primeiro número de string literal analisável que ele encontra na input. Apenas o . pode ser usado para especificar um número de ponto flutuante. Se você está aceitando inputs de diferentes localidades, use uma substituição de string:

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

A function usa o operador unário em vez de parseFloat porque parece que você quer ser rigoroso sobre a input. parseFloat("1ABC") seria 1 , enquanto que usando o operador unário +"1ABC" retorna NaN . Isso torna MUITO mais fácil validar a input. Usar o parseFloat é apenas supor que a input está no formato correto.

usar:

 theNumber.toLocaleString(); 

obter uma string formatada corretamente com os separadores decimais e

Tanto quanto eu saiba, o próprio javascript só sabe sobre o . separador para casas decimais. Pelo menos uma pessoa cujo julgamento eu confio em JS coisas concorda:

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