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

时间:2011-12-08 18:20:14

标签: clojure

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

(def x1 (line-seq (BufferedReader. (StringReader. x1))))

如果我输入5 5,x1将被绑定(“5 5”)

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

3 个答案:

答案 0 :(得分: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)

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

(defn str-to-ints
  [string]
  (map #(Integer/parseInt %)
        (.split #" " string)))

您可以在最后一行使用(.split string " ")删除正则表达式。

答案 1 :(得分:4)

适用于所有数字,如果不是数字,则返回nil(因此您可以在生成的seq中过滤掉nils)

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

E.g。

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

答案 2 :(得分:1)

字符串可以用括号括起来,然后用读取字符串函数计算为 clojure 列表:

(def f #(read-string (str "(" % ")")))
(f "5 4")
; => (5 4)