Number Human Prettifier
JS
S
JavaScriptBetter human prettifier for numbers.
1const SUFFIXES = ['', 'k', 'M', 'B', 'T', 'Q'];
2
3function round(number, precision) {
4 let rounder = Math.pow(10, precision);
5 return Math.round(number * rounder) / rounder;
6}
7
8function getSuffixIndex(number) {
9 return Math.floor(Math.log(Math.abs(number)) / Math.log(1000));
10}
11
12function trimOverflow(number, precision) {
13 const isNegative = Number(number) < 0;
14 const absoluteNumber = String(Math.abs(Number(number)));
15 const adjustedPrecision = absoluteNumber.indexOf('.') > -1 ? precision + 2 : precision + 1;
16 let firstPrecisionCharacters = absoluteNumber.substring(0, adjustedPrecision);
17 const lastChar = firstPrecisionCharacters[firstPrecisionCharacters.length - 1];
18 if (lastChar === '.') {
19 firstPrecisionCharacters = firstPrecisionCharacters.substring(0, firstPrecisionCharacters.length - 1);
20 }
21 return isNegative ? `-${firstPrecisionCharacters}` : firstPrecisionCharacters;
22}
23
24function stringify(number, precision) {
25 const roundedAndStringified = round(number, precision).toString();
26 const roundedAndTrimmed = trimOverflow(roundedAndStringified, precision);
27 return roundedAndTrimmed;
28}
29
30function humanize(number, precision) {
31 if (precision === undefined) precision = 1;
32 if (!number) return '0';
33 if (number > -1 && number < 1) return stringify(number, precision - 1);
34 let suffixIndex = getSuffixIndex(number);
35 let value = number / Math.pow(1000, suffixIndex);
36 return `${stringify(value, precision - 1)} ${SUFFIXES[suffixIndex]}`;
37}
38
39// Test Bed
40// ----------------------------------------------------------------------------
41const numbers = [
42 -1234567890,
43 -123456789,
44 -12345678,
45 -1234567,
46 -123456,
47 -12345,
48 -1234,
49 -123.55,
50 -12,
51 -1,
52 0,
53 1,
54 12,
55 123,
56 1234,
57 12345,
58 123456,
59 1234567.3,
60 12345678,
61 123456789,
62 1234567890
63];
64
65function testSmartNumbersLibrary(smartUnit) {
66 // REMOVE
67 console.log('SMART UNIT >> ', smartUnit);
68 for (let number of numbers) {
69 console.log('result > ' + number, humanize(number, smartUnit));
70 }
71}
72// Smart 3
73testSmartNumbersLibrary(3);
74testSmartNumbersLibrary(4);
75testSmartNumbersLibrary(5);
76
77console.log('running');
78Created on 12/3/2019