Arc Cross Reference

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]))))))))