Arc Forumnew | comments | leaders | submitlogin
2 points by almkglor 5967 days ago | link | parent

Arc doesn't have any.

If it's always N decimal places of a reasonable number, you can do magic stuff like:

  (def to-N-places (f (o N 3))
    (with (fact (let rv 1
                  (repeat N (zap * rv 10))
                  rv)
           float [+ _ 0.0])
      (pr:/ (float:floor:* f fact) (float fact))))
It won't pad though.


3 points by eds 5966 days ago | link

Your version doesn't round.

  arc> (do (to-N-places 5.123456789 5) (prn))
  5.12345
  nil
But the following function will.

  (def to-N-places (f (o N 3))
    (let s (string (to-nearest f (expt 10.0 (- N))))
      (cut s 0 (min (+ N 1 (pos #\. s)) (len s)))))

  arc> (to-N-places 5.123456789 5)
  "5.12346"
(That said, there may be other problems with it.)

Personally, I think we really need CL-style format.

-----

1 point by eds 5963 days ago | link

After a bit more searching, I finally found a page on printing numbers in the scheme cookbook (http://schemecookbook.org/Cookbook/NumberPrinting), specifically the first example which uses SRFI 48 for some basic formatting support (http://srfi.schemers.org/srfi-48/srfi-48.html). The following to works in Anarki/MzScheme 352.

  arc> ($ (require (lib "48.ss" "srfi")))
  #<void>
  arc> (def format args ($ (format ,@args)))
  #<procedure: format>
  arc> (format "~4,4F" (sqrt 2))
  "1.4142"
Enjoy ;-)

-----