Clojure中的八进制数字处理

时间:2017-01-05 15:52:45

标签: clojure octal

我试图在Clojure中创建一个八进制处理函数,到目前为止我有这个:

(defn octal [a]
    (if (= 023 a) 
      (Integer/toOctalString a)
      a))

我有' 023'我想用一些逻辑替换它,检查一个数字是否以' 0'开头。我知道开始了吗?对于字符串,是否有与数字一起使用的方法?

我试图这样做,好像我传递Integer / toOctalString一个没有0的整数,它传回一个更大的数字。例如。 2345变为4451。

谢谢

2 个答案:

答案 0 :(得分:1)

似乎read-string可以为您做到这一点:

(read-string "023")
; ==> 19

(read-string "19")
; ==> 19

如果你想读取没有前缀的八进制数,你可以在传递它之前简单地添加零:

(defn octal->integer [s]
  (read-string (str \0 s)))

(octal->integer "23")
; ==> 19

答案 1 :(得分:0)

输出数字时:

内置的format函数做得很好:

user> (format "%o" 19)
"23"

当然没有任何关于数字的知道它是否最初是以特定格式提供的,但是如果你将它放入一个集合中并直接或在元数据中存储该信息,你可以跟踪它。

<小时/> 就阅读数字而言:

如果Clojure数字以前导零开始

,则默认为八进制数

通常警告 clojure.core / read-string IS TOTALLY UNSAFE 用于不受信任的输入。如果不仔细管理,它将在读取时从字符串运行代码。

用户使用clojure.edn / read-string

他们都会为你读一个八进制数字就好了:

user> (clojure.edn/read-string "023")
19
user> (read-string "023")
19

并且clojure.edn / read-string将拒绝你的服务器:

user> (read-string "#=(println \"Pwning your server now\")")
Pwning your server now
nil

user> (clojure.edn/read-string "#=(println \"Pwning your server now\")")
RuntimeException No dispatch macro for: =  clojure.lang.Util.runtimeException (Util.java:221)

因此,习惯使用clojure.edn来获取它实际上不属于您程序的所有数据。

<小时/> PS:有一个动态变量可以设置为关闭读取字符串的reader-eval功能,并且取决于它是一个等待发生的事故。