Clojure中read-string解析01-07正常,解析08报错原因咨询
为什么
(read-string "08")会抛出NumberFormatException? 这个问题其实和Clojure底层解析数字的规则有关,我来给你拆解清楚:
以0开头的数字会被默认解析为八进制数
Clojure的read-string函数依赖clojure.lang.LispReader处理字符串解析,当它遇到以0开头的数字字符串时,会默认将其当作八进制数解析。八进制数的基数是8,每一位只能是0到7之间的有效数字,这就是为什么"01"到"07"都能正常解析成对应的十进制数值(比如"07"会被转成7)。08不符合八进制数的规则
八进制数里根本没有8这个数字,所以当解析"08"时,LispReader会判定这是一个无效的八进制数,直接抛出NumberFormatException,提示Invalid number: 08。如果需要解析以0开头的十进制数怎么办?
如果你实际需求是把"08"当作十进制数解析,可以用两种方式:- 使用Java的工具方法显式指定基数:
(Integer/parseInt "08" 10) - 在字符串里加上十进制标记
10r:(read-string "10r08"),这样Clojure就会按照十进制规则解析这个数字。
- 使用Java的工具方法显式指定基数:
内容的提问来源于stack exchange,提问作者Aman shah
相关产品推荐
相关产品推荐

