Бувать такі форми, особливо в фінансових проектах, коли вам треба обробляти всі сценії. Що саме, якщо користувач вставить в поле суму з пробілами (1 000 000), з крапкою (100.20), з крапкою і комами (1,235,321.23), просто з комою (1000,25), і тому подібні випадки. В фін компаніях це обов'язкове правило
Також в багатьох випадках потрібно вказувати точну ціну, разом з числами після крапки, навіть якщо вони .00. Мені трапилася така задача на днях в одній фін компанії, тому щоб ви не ломали мізок, я вирішив поділитися обробкою такого сценарія.
const amountToString = value => {
if (!value || value === null || value === undefined) return "0.00";
let s = String(value).trim();
if (typeof value === 'number' && Number.isFinite(value)) s = value.toString();
s = s.replace(/[ \u00A0\u202F]/g, '');
const lastComma = s.lastIndexOf(',');
const lastDot = s.lastIndexOf('.');
if (lastComma !== -1 && lastDot !== -1) {
const useCommaAsDecimal = lastComma > lastDot;
if (useCommaAsDecimal) {
s = s.replace(/\./g, '');
s = s.substring(0, lastComma).replace(/,/g, '') + '.' + s.substring(lastComma + 1);
} else {
s = s.replace(/,/g, '');
}
} else if (lastComma !== -1 && lastDot === -1) {
s = s.replace(/,/g, '.');
} else {
s = s.replace(/,/g, '');
}
if (!s.includes('.')) return s + '.00';
if (s.startsWith('.')) s = '0' + s;
if (s.endsWith('.')) return s + '00';
const [intPart, fracPart] = s.split('.');
if (typeof fracPart === 'undefined' || fracPart.length === 0) return intPart + '.00';
if (fracPart.length === 1) return intPart + '.' + fracPart + '0';
return intPart + '.' + fracPart;
}