-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathformat-number.ts
51 lines (41 loc) · 1.75 KB
/
format-number.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
* Please refer to the terms of the license agreement in the root of the project
*
* (c) 2024 Feedzai
*/
import { isNumber } from "..";
import { shortenNumber } from "./shorten-number";
/**
* Formats the number with the max number of decimal places.
*/
export function formatNumber(number: number, maxDecimalPlaces: number): string | number {
if (!isNumber(number)) {
throw Error("formatNumber: A valid number must be provided in order to format it");
}
// If value is < 1000 we won't add decimal points even if maxDecimalPlaces is defined
if (number < 1000) {
if (Number.isInteger(number)) {
return number;
}
return parseInt(number.toFixed(0));
}
const isToRoundNumber = !isNumber(maxDecimalPlaces) || maxDecimalPlaces === 0;
const abbreviatedNumberAndSuffix = shortenNumber(number, isToRoundNumber);
if (maxDecimalPlaces > 0) {
const [abbreviatedNumber, suffix] = abbreviatedNumberAndSuffix;
const abbreviatedNumberArray = abbreviatedNumber.toString().split(".");
const numbersBeforeDecimalPoint = abbreviatedNumberArray[0];
if (abbreviatedNumberArray.length === 1) {
return abbreviatedNumberAndSuffix.join("");
}
// If the value is higher than 1000 (1K, 1M, etc) we want to add the decimal points
// like 1700 to be 1.7K instead of 2K. But the limit is three digits so 173.1K is going to be 173K
if (parseInt(numbersBeforeDecimalPoint) > 100) {
return `${numbersBeforeDecimalPoint + suffix}`;
}
const numbersAfterDecimalPoint = abbreviatedNumberArray[1].slice(0, maxDecimalPlaces);
const parsedAbbreviatedNumber = `${numbersBeforeDecimalPoint}.${numbersAfterDecimalPoint}`;
return `${parsedAbbreviatedNumber + suffix}`;
}
return abbreviatedNumberAndSuffix.join("");
}