Почему `parseInt` ведет себя по-другому и возвращает только 23 для чисел больше 23? [Дубликат]

Я получил эту ошибку после выполнения mvn eclipse:eclipse Это немного испортило мой файл .classpath.

Если бы изменить строки в .classpath из

<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

to

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />
222
задан w5m 5 July 2013 в 17:03
поделиться

6 ответов

Он преобразует null в строку "null" и пытается ее преобразовать. Для радиусов с 0 по 23 нет цифр, которые он может преобразовать, поэтому он возвращает NaN. В 24, "n", 14-я буква, добавляется в цифровую систему. На 31, "u" добавляется 21-я буква, и вся строка может быть расшифрована. В поле «37» уже нет никакого действительного набора цифр, которое может быть сгенерировано, и возвращается NaN.

js> parseInt(null, 36)
1112745

>>> reduce(lambda x, y: x * 36 + y, [(string.digits + string.lowercase).index(x) for x in 'null'])
1112745
235
ответ дан Ignacio Vazquez-Abrams 31 August 2018 в 12:46
поделиться

Игнасио Васкес-Абрамс прав, но позволяет точно видеть , как это работает ...

Из 15.1.2.2 parseInt (string , radix):

Когда вызывается функция parseInt, выполняются следующие шаги:

  • Пусть inputString - ToString (string).
  • Пусть S - вновь созданная подстрока inputString, состоящая из первого который не является StrWhiteSpaceChar, и все символы, следующие за этим символом. (Другими словами, удалите ведущее белое пространство.)
  • Пусть знак равен 1.
  • Если S не пусто и первый символ S является знаком минус, -1.
  • Если S не пусто и первый символ S является знаком плюс + или знаком минус, то удалите первый символ из S.
  • . Пусть R = ToInt32 (radix).
  • Пусть stripPrefix будет true.
  • Если R ≠ 0, то a. Если R & lt; 2 или R> 36, затем верните NaN. б. Если R ≠ 16, пусть stripPrefix будет false.
  • Else, R = 0 a. Пусть R = 10.
  • Если stripPrefix истинно, то a. Если длина S не менее 2, а первые два символа S - «0x» или «0X», то удалите первые два символа из S и R = 16.
  • Если S содержит любой символ, который не является цифрой radix-R, тогда пусть Z - подстрока S, состоящая из всех символов до первого такого символа; в противном случае пусть Z будет S.
  • Если Z пуст, верните NaN.
  • Пусть mathInt - математическое целочисленное значение, которое представлено Z в нотации radix-R, используя буквы AZ и az для цифр со значениями от 10 до 35. (Однако, если R равно 10, а Z содержит более 20 значащих цифр, каждая значимая цифра после 20-го может быть заменена цифрой 0 по выбору реализации, а если R не является 2, 4, 8, 10, 16 или 32, то mathInt может быть зависимым от реализации приближением к математическому целочисленному значению, которое представлено Z в нотации radix-R.)
  • Пусть number - значение Number для mathInt.
  • Возвращаемый знак × номер.

ПРИМЕЧАНИЕ parseInt может интерпретировать только ведущую часть строки как целочисленное значение; он игнорирует любые символы, которые не могут быть интерпретированы как часть обозначения целого числа, и не указывается указание на то, что любые такие символы были проигнорированы.

Здесь есть две важные части. Я смел их обоих. Итак, прежде всего, мы должны выяснить, что представляет toString представление null. Нам нужно посмотреть Table 13 — ToString Conversions в разделе 9.8.0 для этой информации:

enter image description here [/g1]

Отлично, теперь мы знаем, что выполнение toString(null) внутренне дает строку 'null'. Отлично, но как именно он обрабатывает цифры (символы), которые недопустимы в предоставленном радиксе?

Мы смотрим выше на 15.1.2.2, и мы видим следующее замечание:

Если S содержит любой символ, который не является знаком radix-R, тогда пусть Z - подстрока S, состоящая из всех символов перед первым таким символом; в противном случае пусть Z будет S.

Это означает, что мы обрабатываем все цифры PRIOR указанному основанию и игнорируем все остальное.

В принципе, выполнение parseInt(null, 23) - это такой же предмет как parseInt('null', 23). u заставляет игнорировать два l (хотя они являются частью основания 23). Поэтому мы можем только разобрать n, сделав синтаксис всего слова parseInt('n', 23). :)

В любом случае, большой вопрос!

80
ответ дан David Titarenco 31 August 2018 в 12:46
поделиться

parseInt использует буквенно-цифровое представление, тогда в base-24 «n» действительно, но «u» является недопустимым символом, тогда parseInt только анализирует значение «n» ....

parseInt("n",24) -> 23

в качестве примера попробуйте с этим:

alert(parseInt("3x", 24))

Результат будет «3».

7
ответ дан fdaines 31 August 2018 в 12:46
поделиться

Я думаю, null преобразуется в строку "null". Таким образом, n на самом деле 23 в 'base24' (то же самое в 'base25' +), u недопустимо в 'base24', поэтому остальная часть строки null будет проигнорирована. Вот почему он выдает 23, пока u не станет действительным в «base31».

15
ответ дан Floern 31 August 2018 в 12:46
поделиться

Mozilla сообщает нам :

function parseInt преобразует свой первый аргумент в строку, анализирует его и возвращает целое число или NaN. Если не NaN, возвращаемое значение будет десятичным целочисленным представлением первого аргумента, принятого как число в указанном базисе (base). Например, радиус 10 указывает на преобразование из десятичного числа, 8 восьмеричных, 16 шестнадцатеричных и т. Д. Для радиусов выше 10 буквы алфавита указывают цифры больше 9. Например, для шестнадцатеричных чисел (основание 16) используются A-F.

В спецификация , 15.1.2.2/1 сообщает нам, что преобразование в строку выполняется с использованием встроенного ToString, который (согласно 9.8) дает "null" (не путать с toString, что "u"!).

Итак, давайте рассмотрим parseInt("null", 24).

Конечно, это не целочисленная строка base-24 целиком, но «n» - : decimal 23 .

Теперь разбор остановок после вычитания десятичной цифры 23, потому что "u" не найден в системе base-24:

Если S содержит любой символ, который не является знаком radix-R, то пусть Z - подстрока S, состоящая из всех символов до первого такого символа; в противном случае пусть Z является S. [15.1.2.2/11]

(И поэтому parseInt(null, 23) (и более низкие радиусы) дает вам NaN, а не 23: "n" не находится в системе base-23.)

118
ответ дан Lightness Races in Orbit 31 August 2018 в 12:46
поделиться
parseInt( null, 24 ) === 23

эквивалентен

parseInt( String(null), 24 ) === 23

, который эквивалентен

parseInt( "null", 24 ) === 23

. Цифры для основания 24 равны 0, 1, 2, 3, 4, 5 , 6, 7, 8, 9, a, b, c, d, e, f, ..., n.

Спецификация языка говорит

  1. Если S содержит любой символ, который не является знаком radix-R, то пусть Z - подстрока S, состоящая из всех символов до первого такого символа; в противном случае пусть Z является S.

, который является частью, которая гарантирует, что целые литералы в стиле C, такие как 15L, правильно разбираются, поэтому приведенное выше эквивалентно

parseInt( "n", 24 ) === 23

"n" является 23-й буквой списка цифр выше.

QED

33
ответ дан Mike Samuel 31 August 2018 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: