如何将clojure数字串转换为单独的整数?

oct*_*bus 7 clojure

我可以在repl中读取这样的一些数据.对于一个真正的程序,我计划以let特殊形式分配.

(def x1 (line-seq (BufferedReader. (StringReader. x1))))
Run Code Online (Sandbox Code Playgroud)

如果我输入5 5,则x1被绑定("5 5")

我想将一个元素的列表转换为两个整数的列表.我怎样才能做到这一点?我一直在玩解析空格上的字符串,但是在执行转换为整数时遇到了问题.

Jan*_*Jan 8

这有帮助吗?在Clojure 1.3.0中:

(use ['clojure.string :only '(split)])
(defn str-to-ints
  [string]
  (map #(Integer/parseInt %)
        (split string #" ")))
(str-to-ints "5 4")
; => (5 4)
(apply str-to-ints '("5 4"))
; => (5 4)
Run Code Online (Sandbox Code Playgroud)

如果您使用的Clojure版本没有clojure.string命名空间,您可以跳过use命令并按以下方式定义函数.

(defn str-to-ints
  [string]
  (map #(Integer/parseInt %)
        (.split #" " string)))
Run Code Online (Sandbox Code Playgroud)

你可以(.split string " ")在最后一行使用摆脱正则表达式.

  • @googolplex,`(.split string"")`实际上.谢谢你指出它,我已经修改了答案. (2认同)

小智 5

适用于所有数字并在它不是数字的情况下返回 nil(因此您可以在结果序列中过滤掉 nil)

(require '[clojure.string :as string])

(defn parse-number
  "Reads a number from a string. Returns nil if not a number."
  [s]
  (if (re-find #"^-?\d+\.?\d*$" s)
    (read-string s)))
Run Code Online (Sandbox Code Playgroud)

例如

(map parse-number (string/split "1 2 3 78 90 -12 0.078" #"\s+"))
; => (1 2 3 78 90 -12 0.078)
Run Code Online (Sandbox Code Playgroud)