2011-11-30 108 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