import { escapeRegExp } from '@lendi-ui/commons/utils'; const formatToCurrency = (_value: string) => { const decimalSeparator = '.'; if (_value === '' || _value === undefined) { return ''; } const value = decimalSeparator !== '.' ? replaceDecimalSeparator(_value, decimalSeparator) : _value; // This is somewhat of an overkill way to do currency formatting, // but it covers some interesting edge cases like if there's a decimal number (123.10) // and you delete the 123, it will magically replace it with a 0 to ensure proper format (0.10) const numberFormatter = new Intl.NumberFormat('en-AU', { minimumFractionDigits: 0, maximumFractionDigits: 20, }); let formatted = numberFormatter.format(Number(value)); // Include decimal separator if user input ends with decimal separator const includeDecimalSeparator = _value.slice(-1) === decimalSeparator ? decimalSeparator : ''; const [, decimals] = value.match(RegExp('\\d+\\.(\\d+)')) ?? []; // Keep original decimal padding if no decimalScale if (decimals && decimalSeparator) { if (formatted.includes(decimalSeparator)) { formatted = formatted.replace(RegExp(`(\\d+)(${escapeRegExp(decimalSeparator)})(\\d+)`, 'g'), `$1$2${decimals}`); } else { formatted = `${formatted}${decimalSeparator}${decimals}`; } } return [formatted, includeDecimalSeparator].join(''); }; /** * Before converting to Number, decimal separator has to be . */ const replaceDecimalSeparator = (value: string, decimalSeparator: '.'): string => { let newValue = value; if (decimalSeparator && decimalSeparator !== '.') { newValue = newValue.replace(RegExp(escapeRegExp(decimalSeparator), 'g'), '.'); } return newValue; }; export default formatToCurrency;