Co to jest symbol separatora dziesiętnego w JavaScript?

Myśl uderzyła mnie, gdy pisałem fragment kodu JavaScript, który przetwarzał niektóre wartości zmiennoprzecinkowe. Co to jest symbol punktu dziesiętnego w JavaScript? Czy to zawsze .? A może jest specyficzna dla kultury? A co z .toFixed() i .parseFloat()? Jeśli przetwarzam dane wejściowe użytkownika, prawdopodobnie będzie ono zawierać symbol separatora dziesiętnego specyficznego dla lokalnej kultury.

Ostatecznie chciałbym napisać kod, który obsługuje zarówno punkty dziesiętne w user input-culture-specific jak i ., ale nie mogę napisać takiego Kod, Jeśli Nie wiem, czego oczekuje JavaScript.

Dodano: OK, Rubens Farias proponuje spojrzeć na podobne pytanie które ma zgrabną akceptowaną odpowiedź:

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

To miłe, to pozwala mi uzyskać miejsce dziesiętne. Krok w kierunku rozwiązania, bez wątpienia.

Teraz, pozostałą częścią będzie określenie, jakie jest zachowanie .parseFloat(). Kilka odpowiedzi wskazuje, że dla literałów zmiennoprzecinkowych ważne jest tylko .. Czy .parseFloat() działa w ten sam sposób? A może wymaga lokalnego separatora dziesiętnego w jakiejś przeglądarce? Czy są jakieś inne metody parsowania liczb zmiennoprzecinkowych? Czy mam zrobić coś dla pewności?

Author: Community, 2010-01-18

3 answers

Zgodnie ze specyfikacją, Decymal jest zdefiniowany jako:

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

I dla zaspokojenia argumentu parsefloata:

  1. niech inputString będzie ToString (string).
  2. niech trimmedString będzie podłańcuchem inputString składającym się z lewego znaku, który nie jest StrWhiteSpaceChar i wszystkich znaków na prawo od tego znaku.(Innymi słowy, Usuń wiodącą białą spację.)
  3. Jeśli ani trimmedString, ani żaden prefiks trimmedString nie spełnia składnia StrDecimalLiteral( patrz 9.3.1), return NaN.
  4. niech numberString będzie najdłuższym przedrostkiem trimmedstringu, który może być samym trimmedstringiem, spełniającym składnię Strdecimalliterala.
  5. Zwraca wartość liczbową dla MV

Tak więc numberString staje się najdłuższym przedrostkiem trimmedString, który spełnia składnię StrDecimalLiteral, co oznacza pierwszą możliwą do przetworzenia literalną liczbę łańcuchów, którą znajduje na wejściu. Tylko . może być użyty do określ liczbę zmiennoprzecinkową. Jeśli akceptujesz dane wejściowe z różnych lokalizacji, użyj string replace:

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

Funkcja używa operatora uniary zamiast parseFloat, ponieważ wydaje mi się, że chcesz być surowy w odniesieniu do danych wejściowych. {[3] } będzie 1, podczas gdy użycie operatora jednoargumentowego +"1ABC" zwraca NaN. Znacznie ułatwia to walidację danych wejściowych. Używanie parseFloat to tylko zgadywanie, że dane wejściowe są w odpowiednim formacie.

 19
Author: Andy E,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-30 17:57:00

Użycie:

theNumber.toLocaleString();

Aby uzyskać poprawnie sformatowany ciąg znaków z odpowiednimi separatorami dziesiętnymi i tysiącami

 10
Author: jspcal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 10:30:32

Z tego co wiem, javascript sam wie tylko o separatorze . dla dziesiętnych. Przynajmniej jedna osoba, której osąd ufam w sprawach JS, zgadza się:

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

 2
Author: Matt Sach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 10:29:54