format-num-util
Version:
A utility function to format numbers with currency, unit and millify support.
46 lines (37 loc) • 1.63 kB
JavaScript
/**
* Formats a number with commas, optional currency symbol, unit, and compact/millified format.
*
* @param {Object} options
* @param {number|string} options.num - Number to format
* @param {string} [options.unit] - Optional unit like kg, km
* @param {string} [options.curr] - Optional currency symbol like ₹ or $
* @param {boolean} [options.millify=false] - Whether to shorten large numbers (e.g. 1K, 1M)
* @returns {string} Formatted number string
*/
export default function formatNum({ num, unit, curr, millify = false }) {
if (num === null || num === undefined || num === '') return '-';
const parsedNumber = parseFloat(num);
if (isNaN(parsedNumber)) return '-';
const isNegative = parsedNumber < 0;
const absoluteNumber = Math.abs(parsedNumber);
const millifyNumber = (n) => {
const suffixes = ['', 'K', 'M', 'B', 'T'];
if (n < 1000) return n.toString();
let i = 0;
let value = n;
while (value >= 1000 && i < suffixes.length - 1) {
value /= 1000;
i++;
}
return value.toFixed(1).replace(/\.0$/, '') + suffixes[i];
};
const integerPart = parseInt(absoluteNumber.toFixed(2), 10);
const decimalPart = (absoluteNumber % 1).toFixed(2).slice(2);
const formattedNumber = integerPart.toLocaleString('en-IN') + (decimalPart !== '00' ? `.${decimalPart}` : '');
return (
(isNegative ? '-' : '') +
(curr ? curr : '') +
(millify ? millifyNumber(absoluteNumber) : formattedNumber) +
(unit ? ` ${unit}` : '')
);
}