Number Human Prettifier

JS
S
JavaScript

Better 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');
78

Created on 12/3/2019