Dollar Format

September 30, 2016

This isn’t hard, just tedious; exactly how you do it depends on the features your language provides:

(define (dollar x)
  (define (commas n)
    (let ((xs (reverse (map number->string (digits n)))))
      (let loop ((xs (drop 3 xs)) (zs (reverse (take 3 xs))))
        (if (null? xs) (apply string-append zs)
          (loop (drop 3 xs) (append (reverse (take 3 xs)) (list ",") zs))))))
  (define (zero n)
    (if (zero? n) "00"
      (if (< n 10) (string-append "0" (number->string n))
        (number->string n))))
  (let* ((dollars (inexact->exact (floor x)))
         (cents (inexact->exact (round (* 100 (- x dollars))))))
    (string-append "$" (commas dollars) "." (zero cents))))

> (dollar 1234567.8912)
"$1,234,567.89"

You can run the program at http://ideone.com/978aEz.

Pages: 1 2

6 Responses to “Dollar Format”

  1. matthew said
    (display (dollar 1234567.9999)) (newline)
    $1,234,567.100
    
  2. tchaardge said

    Hi

    /* 1234567.8912 as $1,234,567.89 */
    function f$(f) {
    /** MATH **/
    /* 100,033 -> 10003,3 */
    f = f*100
    /* 10003,3 -> 10003 */
    f = Math.round(f)
    /* 10003 -> 100,03 */
    f = f / 100.0

    /** SRING **/
    /* 100,03 -> [1,0,0,’,’,0,3] */
    var ent = f.toString().split(‘.’)[0]
    var dec = f.toString().split(‘.’)[1]
    dec = dec+’00’
    dec = dec.substr(0,3)
    ent = ent.split(”)
    ent = ent.reverse().map(function(c,i) {
    if(i % 3 == 0 && i != 0)
    return c+’,’
    return c
    }).reverse().join(”)
    return ‘$’+ent+’.’+dec

    }

    console.log(f$(1000.200))

    Thanks

  3. xem said

    ES6:

    to$ = n => “$”+n.toFixed(2).replace(/(\d)(?=(\d\d\d)+\.)/g,”$1,”);

    Demo: http://codepen.io/xem/pen/amyrxd

  4. maximeeuziere said

    ES6, shorter:

    to$ = n => “$”+n.toFixed(2).replace(/.(?=(…)+\.)/g,”$&,”);

  5. Alex B. said

    Python 3 solution without using round() or str.format():

    def dollars(n):
        '''Format a number as a dollar amount string'''
        n = int(n*100)
        s = str(n)
        i, d = s[:-2], s[-2:]
        l = [i[(c-3 if c >= 3 else 0):c] for c in range(len(i),0,-3)]
        o = '.'.join((','.join(reversed(l)),d))
        return ''.join(('$', o))
    
  6. V said

    In Ruby

    
      def format(amount)
        decimal, fraction = amount.round(2).to_s.split('.')
        decimal_part = decimal.
          chars.
          reverse.
          each_slice(3).
          map { |xs| xs.reverse.join }.
          reverse.
          join(",")
    
        "$" + decimal_part + "." + fraction.ljust(2, "0")
      end
      
    

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: