我想以漂亮的方式打印花车。具体来说,我想在小数点后打印两个数字,但前提是这些数字不为零。
如果数字不是偶数,则此方法有效:
(let ((f 1.240))
(format t "~,2F" f))
--> 1.24
但如果数字是整数,我得到这个:
(let ((f 1240))
(format t "~,2F" f))
-->1240.00
是否有一些优雅的方法可以做到这一点,还是我必须在打印前手动检查小数点数?
答案 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