Elisp Pretty Numbers

30 Nov 2011


Here are some elisp functions I cooked up today to make looking at numbers from within emacs a little more convenient.

First, a function to add a thousands separator to a (possibly floating point) number:

(defun my-thousands-separate (num)
  "Formats the (possibly floating point) number with a thousands
separator."
  (let* ((nstr (number-to-string num))
         (dot-ind (string-match "\\." nstr))
         (nstr-no-decimal (if dot-ind
                               (substring nstr 0 dot-ind)
                             nstr))
         (nrest (if dot-ind
                    (substring nstr dot-ind)
                  nil))
         (pretty nil)
         (cnt 0))
    (dolist (c (reverse (append nstr-no-decimal nil)))
      (if (and (zerop (% cnt 3)) (> cnt 0))
          (setq pretty (cons ?, pretty)))
      (setq pretty (cons c pretty))
      (setq cnt (1+ cnt)))
    (concat pretty nrest)))

Usage:

(my-thousands-separate 4324.32)
  ==> "4,324.32"
(my-thousands-separate 42)
  ==> "42"
(my-thousands-separate 929344324432444.0)
  ==> "929,344,324,432,444.0"

With that function in hand, I wrote a little convenience function to help maintain sanity while looking at ginourmous numbers:

(defun my-prettify-number (n)
  "Prints a number to the minibuffer in a few delicious
formats. If `current-word' is a number, that's what is used,
otherwise we prompt the user."
  (interactive
   (let ((default
           (save-excursion
             (skip-chars-backward "0-9")
             (if (looking-at "[-+]?\\([0-9]*\.\\)?[0-9]+")
                 (string-to-number (current-word))
               (read-number "Number: ")))))
     (list default)))
  (let ((nstr (number-to-string n))
        (npretty (my-thousands-separate n)))
    (message "%s | %g | %d | %s" npretty n n nstr)))

Usage: put your point on a number and do M-x my-prettify-number.


Comments
blog comments powered by Disqus