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');
...