0

问题是如果我用 08 或 09 传递这个函数(在我的 REPL 中),它会给我一个错误。

我尝试删除周围的括号以查看错误是否会消失。

(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))

我希望 [number] 在传递该确切数字时返回 08 或 09。

4

1 回答 1

0

计算机通常将数字解释为八进制0809八进制,这是一个错误,因为八进制数字仅从 0..7 开始。从历史上看,人们认为使用前导零字符0是一种聪明的代码类型,因为该字符0看起来像Oword中的字符Octal。因此,当编译器看到一个以 a 开头的整数时0,它被解释为“接下来的数字应该以 base-8 而非 base-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).

我没有收到有关“不匹配分隔符”的错误消息,所以我不确定它是如何产生的。

于 2019-05-28T20:15:04.807 回答