2011-11-30 110 views
4

我想以一种好看的方式打印浮点数。具体而言,我想在小数点后打印两个数字,但只有在这些数字不为零时才可以。格式化小数点后不打印零点的浮点数

这工作,如果数字是不是偶数:

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

--> 1.24 

但是,如果数量为整数,我得到这样的:

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

-->1240.00 

是否有某种优雅的方式来做到这一点,或打印前是否必须手动检查小数点数?

回答

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 
0

你可以使用的格式的条件表达式:

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

--> 1240 
+1

'(让((F 1.1) )(format t“〜:[〜,2f〜;〜d〜]”(integerp f)f))'打印'1.10',但他不想追踪零。然后他再次写道:“只有当这些数字**不为零时”,因此在技术上,您仍然符合规格。 :) – danlei