num[procedure] num m (o digits 2) (o trail-zeros nil) (o init-zero nil)
(def num (m (o digits 2) (o trail-zeros nil) (o init-zero nil))
(let comma
(fn (n)
(tostring
(map [apply pr (rev _)]
(rev (intersperse '(#\,)
(tuples (rev (coerce (string n) 'cons))
3))))))
(if (< digits 1)
(comma (roundup m))
(exact m)
(string (comma m)
(when (and trail-zeros (> digits 0))
(string "." (newstring digits #\0))))
(let n (truncate m)
(string (if (is n 0) (if init-zero 0 "") (comma n))
"."
(withs (rest (string (abs (roundup
(- (* m (expt 10 digits))
(* n (expt 10 digits))))))
v2 (string (newstring (- digits (len rest)) #\0)
rest))
(if trail-zeros
v2
(trim v2 'end [is _ #\0]))))))))
|