JSFiddle - React, Tailwind, and code Playground
JavaScript
const splitThousands = (number) => (dec_point, thousands_point) => {
const splitNum = number.toString().split(dec_point);
splitNum[0] = splitNum[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousands_point);
return splitNum.join(dec_point);
}
const isBigNumber = number => number.toString().includes('e');
const isBigFloat = number => number.toString().includes('-');
const calcTrailing = (dec, len) => (Number(dec) + 2) - len;
const handleBigFloats = (number, decimals) => {
if(!decimals) {
return '0';
}
const [numbers, dec] = number.toString().replace('.', '').split('e-');
const trailingZeros = calcTrailing(dec, numbers.length);
const res = `${'0.'.padEnd(trailingZeros + 2, '0')}${numbers}`;
return decimals ? res.substring(0, 2) + res.substring(2, decimals + 2) : res;
}
const handleBigNumbers = (number, decimals, dec_point, thousands_point) => {
if(isBigFloat(number)) {
return handleBigFloats(number, decimals);
}
return splitThousands(BigInt(number))(dec_point, thousands_point);
}
function handleFiniteNumbers(number, decimals, dec_point, thousands_point) {
if (!isFinite(number)) {
throw new TypeError("number is not finite number");
}
if (!decimals) {
const len = number.toString().split('.').length;
decimals = len > 1 ? len : 0;
}
return splitThousands(parseFloat(number).toFixed(decimals).replace(".", dec_point))(dec_point, thousands_point);
}
const numberFormat = (number, decimals, dec_point = '.', thousands_point = ',') => {
if(number == null || typeof number !== 'number') {
throw new TypeError("number is not valid");
}
if(isBigNumber(number)) {
return handleBigNumbers(number, decimals, dec_point, thousands_point);
}
return handleFiniteNumbers(number, decimals, dec_point, thousands_point);
}
console.log(numberFormat(132323232320.321, 2, ',',...