格式化浮点数而不在小数点后打印零

时间:2011-11-30 23:07:43

标签: string lisp format common-lisp

我想以漂亮的方式打印花车。具体来说,我想在小数点后打印两个数字,但前提是这些数字不为零。

如果数字不是偶数,则此方法有效:

(let ((f 1.240))
  (format t "~,2F" f))

--> 1.24 

但如果数字是整数,我得到这个:

(let ((f 1240))
  (format t "~,2F" f))

-->1240.00

是否有一些优雅的方法可以做到这一点,还是我必须在打印前手动检查小数点数?

2 个答案:

答案 0 :(得分:3)

我不认为使用标准格式指令是可行的。您可以编写自定义格式函数:

(defun my-f (stream arg &optional colon at digits)
  (declare (ignore colon at))
  (prin1 (cond ((= (round arg) arg) (round arg))
               (digits (float (/ (round (* arg (expt 10 digits)))
                                 (expt 10 digits))))
               (t arg))
         stream))

并像这样使用它:

CL-USER> (format t "~/my-f/" 1)
1
NIL
CL-USER> (format t "~/my-f/" 1.0)
1
NIL
CL-USER> (format t "~/my-f/" pi)
3.141592653589793D0
NIL
CL-USER> (format t "~/my-f/" 1.5)
1.5
NIL
CL-USER> (format t "~2/my-f/" 1)
1
NIL
CL-USER> (format t "~2/my-f/" 1.0)
1
NIL
CL-USER> (format t "~2/my-f/" pi)
3.14
NIL
CL-USER> (format t "~2/my-f/" 1.5)
1.5
NIL

答案 1 :(得分:0)

您可以使用FORMAT条件表达式:

(let ((f 1240))
  (format t "~:[~,2f~;~d~]" (integerp f) f))

--> 1240