Подтвердить что ты не робот

Что такое символ разделителя десятичных знаков в JavaScript?

Мне показалось, что я написал фрагмент кода JavaScript, который обрабатывал некоторые значения с плавающей запятой. Что такое символ десятичной точки в JavaScript? Всегда ли это .? Или это зависит от культуры? А как насчет .toFixed() и .parseFloat()? Если я обрабатываю пользовательский ввод, он, вероятно, будет включать в себя локальный символ разделителя десятичных разделителей.

В конечном счете, я хотел бы написать код, который поддерживает как десятичные точки в пользовательском вводе - специфичные для культуры, так и ., но я не могу написать такой код, если не знаю, чего ожидает JavaScript.

Добавлено: ОК, Rubens Farias предлагает посмотреть аналогичный вопрос который имеет аккуратный принятый ответ:

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

Хорошо, это позволяет мне получить десятичную точку локали. Шаг к решению, несомненно.

Теперь оставшаяся часть должна определить, что такое поведение .parseFloat(). В нескольких ответах указывается, что для литералов с плавающей запятой действует только .. Действует ли .parseFloat() так же? Или может потребоваться локальный десятичный разделитель в каком-то браузере? Существуют ли разные методы для разбора чисел с плавающей запятой? Должен ли я разворачивать свой собственный, чтобы быть уверенным?

4b9b3361

Ответ 1

Согласно спецификации, DecimalLiteral определяется как:

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

и для удовлетворения аргумента parseFloat:

  • Пусть inputString будет ToString (строка).
  • Пусть trimmedString является подстрокой inputString, состоящей из самого левого символа, который не является StrWhiteSpaceChar, и всех символов справа от этого символа. (Другими словами, удалите ведущее белое пространство.)
  • Если ни trimmedString, ни любой префикс trimmedString не удовлетворяют синтаксису StrDecimalLiteral (см. 9.3.1), верните NaN.
  • Пусть numberString является самым длинным префиксом trimmedString, который может быть обрезано самой строкой, которая удовлетворяет синтаксису StrDecimalLiteral.
  • Возвращает значение Number для MV

Таким образом, числоString становится самым длинным префиксом trimmedString, который удовлетворяет синтаксису StrDecimalLiteral, что означает первый синтаксический строковый номер строки, который он находит во вводе. Для указания числа с плавающей запятой можно использовать только .. Если вы принимаете входные данные из разных локалей, используйте строку replace:

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

Функция использует унарный оператор вместо parseFloat, потому что мне кажется, что вы хотите быть строгим относительно ввода. parseFloat("1ABC") будет 1, тогда как использование унарного оператора +"1ABC" возвращает NaN. Это значительно облегчает проверку ввода. Использование parseFloat просто догадывается, что вход находится в правильном формате.

Ответ 2

использование:

theNumber.toLocaleString();

чтобы получить правильно отформатированную строку с разделителями в десятичных и десятичных разрядах

Ответ 3

Насколько мне известно, сам javascript знает только о разделителе . для десятичных знаков. По крайней мере один человек, чье решение, которому я доверяю на вещи JS, соглашается:

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