我试图在Clojure中创建一个八进制处理函数,到目前为止我有这个:
(defn octal [a]
(if (= 023 a)
(Integer/toOctalString a)
a))
我有' 023'我想用一些逻辑替换它,检查一个数字是否以' 0'开头。我知道开始了吗?对于字符串,是否有与数字一起使用的方法?
我试图这样做,好像我传递Integer / toOctalString一个没有0的整数,它传回一个更大的数字。例如。 2345变为4451。
谢谢
答案 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功能,并且取决于它是一个等待发生的事故。