Code: Select all
In [5]: format(123456789,',d')
Out[5]: '123,456,789'
Code: Select all
In [5]: format(123456789,',d')
Out[5]: '123,456,789'
Code: Select all
>
(define (format1000 n)
(setq s (reverse (string n)))
(setq acc "")
(for (i 0 (dec (length s)))
(when (and (> i 0) (zero? (% i 3)) (number? (int (s i))))
(setq acc (append acc ",")))
(setq acc (append acc (s i))))
(reverse acc))
> (format1000 123456789)
"123,456,789"
> (format1000 -123456789)
"-123,456,789"
Code: Select all
(define (explode* xs (width 1) (bool nil) (acc '()))
"Works like `explode`, but operates from right to left."
(if (empty? xs)
acc
(< (length xs) width)
(if bool acc (cons xs acc))
(explode* (slice xs 0 (- width)) width bool
(cons (slice xs (- width) width) acc))))
(define (humanize-integer integr (sep ","))
(string (sgn integr "-" "" "")
(join (explode* (string (abs integr)) 3) sep)))
Code: Select all
> (humanize-integer 123456789)
(humanize-integer 123456789)
"123,456,789"
> (humanize-integer -123456789)
(humanize-integer -123456789)
"-123,456,789"
Code: Select all
> (format "%'d" 123456789)
"123,456,789"
Code: Select all
(define (format1000 n)
(append (sgn n "-" "" "") (reverse (join (explode (reverse (string (abs n))) 3) ","))))
(format1000 123456789)
(format1000 -123456789)
Excellent!steloflute wrote:One-liner:Code: Select all
(define (format1000 n) (append (sgn n "-" "" "") (reverse (join (explode (reverse (string (abs n))) 3) ",")))) (format1000 123456789) (format1000 -123456789)
I'm new to new lisp (love it!) but this doesn't work for numbers with a decimal part.rickyboy wrote:Excellent!steloflute wrote:One-liner:Code: Select all
(define (format1000 n) (append (sgn n "-" "" "") (reverse (join (explode (reverse (string (abs n))) 3) ",")))) (format1000 123456789) (format1000 -123456789)
fdb wrote:
I'm new to new lisp (love it!) but this doesn't work for numbers with a decimal part.
My try:
(define (format1000 n)
(let (t (parse (string n) "."))
(append (reverse (join (explode (reverse (first t)) 3) ","))
(if (empty? (rest t))
""
(append "." (last t))))))
> (format1000 12131)
"12,131"
> (format1000 12131.23)
"12,131.23"
Code: Select all
(define (format1000 n)
(append (and (find {^(.*)(\..*)} (string (abs n)) 1) (append (sgn n "-" "" "") (reverse (join (explode (reverse $1) 3) ",")))) (or $2 "")))