fork download
  1. ; i'm embarrassed
  2.  
  3. (define (take n xs)
  4. (let loop ((n n) (xs xs) (ys '()))
  5. (if (or (zero? n) (null? xs))
  6. (reverse ys)
  7. (loop (- n 1) (cdr xs)
  8. (cons (car xs) ys)))))
  9.  
  10. (define (drop n xs)
  11. (let loop ((n n) (xs xs))
  12. (if (or (zero? n) (null? xs)) xs
  13. (loop (- n 1) (cdr xs)))))
  14.  
  15. (define (digits n . args)
  16. (let ((b (if (null? args) 10 (car args))))
  17. (let loop ((n n) (d '()))
  18. (if (zero? n) d
  19. (loop (quotient n b)
  20. (cons (modulo n b) d))))))
  21.  
  22. (define (dollar x)
  23. (define (commas n)
  24. (let ((xs (reverse (map number->string (digits n)))))
  25. (let loop ((xs (drop 3 xs)) (zs (reverse (take 3 xs))))
  26. (if (null? xs) (apply string-append zs)
  27. (loop (drop 3 xs) (append (reverse (take 3 xs)) (list ",") zs))))))
  28. (define (zero n)
  29. (if (zero? n) "00"
  30. (if (< n 10) (string-append "0" (number->string n))
  31. (number->string n))))
  32. (let* ((n (inexact->exact (round (* x 100))))
  33. (dollars (quotient n 100))
  34. (cents (modulo n 100)))
  35. (string-append "$" (commas dollars) "." (zero cents))))
  36.  
  37. (display (dollar 1234567.9999)) (newline)
Success #stdin #stdout 0.02s 8800KB
stdin
Standard input is empty
stdout
$1,234,568.00