Това е леко модифицирана версия на пример в clojure-doc.org:
(defn round2
"Round a double to the given precision (number of significant digits)"
[precision d]
(let [factor (Math/pow 10 precision)]
(/ (Math/round (* d factor)) factor)))
Отговорът на @number23_cn е правилният за много случаи. Въпреки това, истинска функция за закръгляване с аргумент за точност може да бъде полезна, ако например искате да покажете последователност със закръглено всяко число. След това можете просто да картографирате round2
върху последователността, за да форматирате всяко число наведнъж:
(map (partial round2 2) [0.001 10.123456 9.5556])
който се връща
(0.0 10.12 9.56)
Това е по-полезно за по-дълга последователност, разбира се.
Друг вариант е да използвате cl-format
, което е реализация на Clojure на format
на Common Lisp. Подобен е на format
на Clojure (който е базиран на java.util.Formatter
), но има различен синтаксис и позволява някои по-фантастични трикове.
(clojure.pprint/cl-format nil "~,2f" 23.456)
; => "23.46"
Директивата ~{ ~}
позволява обработка на последователности, както в първия пример по-горе:
(clojure.pprint/cl-format nil "~{ ~,2f~}" [0.001 10.123456 9.5556])
; => " 0.00 10.12 9.56"
~{ ~}
очаква да види последователност като аргумент и ще изяде елементи от последователността един по един, използвайки каквито и директиви да се появяват между ~{
и ~}
.
(Главата за format
от Practical Common Lisp е най-доброто въведение в format
на Common Lisp и следователно в cl-format
на Clojure, imo. документацията за CL's format
в обичайния източник, Common Lisp Hyperspec понякога може да бъде труден за използване. раздел на CL's format
a> в
person
Mars
schedule
02.08.2014