Simple format number

Simple format number

by ozzymcduff

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qunit/1.18.0/qunit.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/qunit/1.18.0/qunit.min.css">
<div id="qunit"></div>
<div id="qunit-fixture"></div>

JavaScript

var frac;

(function () {
    /**
     * @license Copyright 2014 - Chris West - MIT Licensed
     */
    var RGX = /(-?)(\d+(\.?)\d*)e(.+)/;

    frac = function frac(num) {
        return +(+num).toExponential().replace(RGX, function (m, neg, num, dot, offset) {
            var zeroes = new Array(Math.abs(offset) + 2).join('0');
            num = (zeroes + num + (dot ? '' : '.') + zeroes).split('.');
            return +(neg + '.' + num.join('').slice(+offset + num[0].length));
        });
    }

})();

function splitIntoThousands(number) {
    var t = null,
        ts = [];
    while (number > 0) {
        t = number % 1000;
        number = Math.floor(number / 1000);
        ts.push(t);
    }
    return ts.reverse();
}

function prec(value, exp) {
    var m = Math.pow(10, exp);
    return Math.round(value * m) / m;
}

function padWithZeroes(n, width) {
    var z = '0';
    n = n + '';
    return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

function padToThousandForIndex(n, i) {
    return i > 0 ? padWithZeroes(n, 3) : n;
}

function format(number, opt) {
    opt = opt || {
        thousands: ',',
        decimal: '.'
    };
    var thousands = opt.thousands,
        decimal = opt.decimal,
        abs = Math.abs(number);
    var dec = frac(abs);
    var num = prec(abs - dec, 10);;
    var ts = splitIntoThousands(num);
    var result = [];
    if (number < 0) {
        result.push('-');
    }
    if (ts.length > 0) {
        result.push(ts.map(padToThousandForIndex).join(thousands));
    } else {
        result.push('0');
    }
    if (dec !== 0) {
        result.push(decimal + (dec).toString().substring(2));
    }
    return result.join('');
}
test("format dec", function (assert) {
    assert.strictEqual(format(1234.11), '1,234.11');
    assert.strictEqual(format(-1234.11), '-1,234.11');
    assert.strictEqual(format(0.11), '0.11');
    assert.strictEqual(format(-0.11), '-0.11');
    assert.strictEqual(format(0.011), '0.011');
   ...