数値を整形とか何とか

TeXでまともな資料を作ろうとすると、数値をちゃんと整形する必要がある。数値の大きさと精度により、適切な書式で書かなければならないのだが、これを手作業で行うのは面倒である。そこで、適当に整形してくれる関数を作ってみた。

(defvar *significant-figures* 2)

(defun float-string (n &optional eof-error-p)
  (let ((n (if (numberp n) n
             (if (stringp n)
                 (read (make-string-input-stream n) eof-error-p))))
        (p (format nil "~D" *significant-figures*)))
    (if (numberp n)
        (if (> n 1e4)
            (substitute-string
             (delete #\+ (format nil (concat "~," p "E") n))
             "e\\([0-9]+\\)" " \\\\times 10^{\\1}")
          (if (> (mod n 1) 0)
              (format nil (concat "~," p "F") n)
            (format nil "~:D" (round n)))))))
(float-string "3948220374")
|
"3.95 \\times 10^{9}"

(float-string "11")
|
"11"

(float-string "3904")
|
"3,904"

(float-string "398.8948")
|
"398.89"

(float-string (expt 2 256))
|
"1.16 \\times 10^{77}"
 
(float-string "nan")
|
nil

実際、何が必要なのか良く把握してないので適当感がひしひしと感じられるが、用途に応じて修正していけば良いだろう。