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
Please enable JavaScript to view the comments powered by Disqus.
blog comments powered by