Проблема в том, что если я передам эту функцию (в моем REPL) с 08 или 09, она выдаст мне ошибку.
Я попытался удалить скобки вокруг, чтобы увидеть, исчезнет ли ошибка.
(defn format-pump-number [number]
(if (.contains (str number) "0")
(str number)
(str "0" number))
(if (> number 9)
(if (< number 100)
(str number)
(throw (Exception. "Dispenser number can only be 2 characters!"))))
(str "0" number))
Я ожидаю, что [число] будет возвращено 08 или 09 при передаче этого точного числа.
Компьютеры обычно интерпретируют числа, такие как 08
или 09
, как восьмеричные, что является ошибкой, поскольку восьмеричные цифры идут только от 0 до 7. Исторически сложилось мнение, что использование ведущего нулевого символа 0
было умным типом кода, поскольку символ 0
выглядит как символ O
из слова Octal
.
Таким образом, когда компилятор видит целое число, начинающееся с 0
, оно интерпретируется как означающее: «Следующие цифры должны интерпретироваться по основанию 8, а не по основанию 10». Пример:
12 => twelve (parsed using base-ten)
012 => ten (parsed using base-eight)
Как вы обнаружили, эта попытка быть слишком умной вызывает проблемы до сих пор.
Так что это вообще не ваша функция, просто плохое сообщение об ошибке. Наблюдать:
(println "val = " 8) => `val= 8`
но
(println "val = " 08)
=> Error refreshing environment: Syntax error reading source at (tst/demo/core.clj:19:20).
Я не получаю сообщение об ошибке, касающееся «Несопоставленный разделитель», поэтому я не уверен, как это произошло.
Вы не можете ввести целочисленный литерал как
08
. Просто используйте8
для числаeight
. Или вы можете изменить функцию, чтобы она принимала строковый аргумент вместо целого числа. Затем вы можете ввести"8"
или"08"
. Строка не имеет ограничений.