Форматирование чисел с плавающей точкой без печати нулей после десятичной точки - PullRequest
4 голосов
/ 01 декабря 2011

Я хочу печатать поплавки красивым способом.В частности, я хочу напечатать два числа после десятичной точки, но только если эти числа не равны нулю.

Это работает, если число не является четным целым числом:

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

--> 1.24 

Но есличисло - это целое число, которое я получаю:

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

-->1240.00

Есть какой-нибудь элегантный способ сделать это, или мне нужно вручную проверять количество десятичных знаков перед распечаткой?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Я не думаю, что это возможно с директивами стандартного формата.Вы можете написать функцию пользовательского формата:

(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 голосов
/ 01 декабря 2011

Вы можете использовать условное выражение FORMAT:

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

--> 1240
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...