将char转换为数字

时间:2012-11-14 13:29:05

标签: numbers lisp char

我正在阅读一个平面文件 - 使用我想要将它们转换成数字的字符。我写了一个将字符串转换为向量的小函数:

(defun string-to-vec (strng)
  (setf strng (remove #\Space strng)) 
    (let ((vec (make-array (length strng))))
      (dotimes (i (length strng) vec)
        (setf (svref vec i) (char strng i)))))

然而,这会返回带有字符条目的向量。如果没有使用char-code将单位数字符转换为函数中的数字,是否有一种简单的方法可以将数字作为数字从文件中读取?

3 个答案:

答案 0 :(得分:3)

除了Rainer的回答之外,让我提一下read-from-string(请注意,Rainer的代码比重复应用read-from-string更有效,因为它只会创建一个流)和parse-integer(唉,没有parse-float)。

请注意,如果您正在阅读CSV文件,则应该使用现成的库而不是编写自己的库。

答案 1 :(得分:2)

以上更短:

? (map 'vector #'identity (remove #\Space "123"))
#(#\1 #\2 #\3)

您可以转换字符串:

(defun string-to-vector-of-numbers (string)
  (coerce 
   (with-input-from-string (s string)
     (loop with end = '#:end
           for n = (read s nil end)
           until (eql n end)
           unless (numberp n) do (error "Input ~a is not a number." n)
           collect n))
   'vector))

但直接从文件中读取数字会更容易。使用READ,可以读取数字。

答案 2 :(得分:1)

请注意read - 类函数受读者宏的影响。

选择一个例子:

* (defvar *foo* 'bar)

*FOO*
* (read-from-string "#.(setq *foo* 'baz)")

BAZ
19
* *foo*

BAZ

正如您所看到的,read-from-string可以隐式设置变量。您可以通过将#.设置为*read-eval*来停用nil阅读器宏,但无论如何,如果输入中只有整数,请考虑使用parse-integer代替。