Я рекомендую просто использовать строку test()
здесь с соответствующим шаблоном регулярного выражения:
^-?\d{1,3}(?:,\d{3})*(?:\.\d+)?$
Вы можете просто отклонить любой ввод, который не проходит это регулярное выражение. Это имеет больше смысла, чем пытаться выполнить замену входных данных, поскольку не все входные данные могут быть восстановлены в любом случае.
Примеры:
var pass1 = 123.456;
var pass2 = -999;
var pass3 = '123,456,789.888';
var fail = '1-3,7';
console.log(/^-?\d{1,3}(?:,\d{3})*(?:\.\d+)?$/.test(pass1));
console.log(/^-?\d{1,3}(?:,\d{3})*(?:\.\d+)?$/.test(pass2));
console.log(/^-?\d{1,3}(?:,\d{3})*(?:\.\d+)?$/.test(pass3));
console.log(/^-?\d{1,3}(?:,\d{3})*(?:\.\d+)?$/.test(fail));
Краткое объяснение того, что делает паттерн:
^ from the start of the string
-? match an optional negative sign
\d{1,3} match one to three digits
(?:,\d{3})* followed by a thousands term (, + 3 digits) zero or more times
(?:\.\d+)? followed by an optional decimal component
$ end of the string