Как составить такое регулярное выражение?

Добрый день. К сожалению, регулярки не самая сильная моя сторона, поэтому надеюсь на вашу помощь.
Мне нужно составить регулярку, которая позволяет:
- писать числа (в input)
- использовать в качестве разделителя десятичной дроби точку либо запятую. Т.е. что-то одно, и только один раз
- автоматически расставляет пробелы для отделения разрядности чисел (1 000, 10 000 000)
- т.е. из предыдущего пункта вытекает, что пробелы разрешены, но запрещено ставить два и более пробелов подряд
- после запятой (или точки) должно быть невозможно ввести более двух символов
- Ну и, соответственно, все другие символы, кроме точек, запятых, пробелов и чисел - запрещены.

Собственными силами удалось нагуглить и досочинять что-то вот такое, но оно не делает всего, что нужно:

str.replace(/[^.,\d]+/g,'').replace(/^([^\.]*\.)|\./g, '$1').replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ')


Буду очень признателен за помощь.
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 1
john36allTa
@john36allTa
alien glow of a dirty mind
Может это поможет или хоть натолкнет на мысль
function format(value){
	let [a,b] = (+value.replace(/[^\d\.,]/g,'').replace(',','.')).toFixed(2).split('.')
		c = a.replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ')
	return `${c},${b}`
}

console.log(format('12734,589'))
// 12 734,59
console.log(format('1 2 7  3s4.5'))
// 12 734,50
console.log(format('12734'))
// 12 734,00

Если хотите всё же ограничить пользователя в вводе по формату, то просто сделайте
<input type="text" id='price' placeholder="12 345,90" required pattern="^\d{1,3}(\s?\d{3})*([\.,]\d+)?$" />


Ну или что то вроде такого:
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы