Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   RegExp для форматирования input.value (https://javascript.ru/forum/misc/82762-regexp-dlya-formatirovaniya-input-value.html)

vlad_kl 29.06.2021 15:11

RegExp для форматирования input.value
 
Добрый день.
Есть задача, создать input.value с мгновенным форматированием числа.
Нечто похожее https://www.omnicalculator.com/finance/margin

Юзер вводит 5000 - инпут сразу меняется на 5,000 и так далее.
Это можно решить следующим кодом
input.value = input.value.split(',').join('').replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")

Но при input type = number это, увы, не работает.

В таком случае выход следующий - сделать input type = text и добавить запрет на ввод любых символов, кроме цифр 0-9, запятой, минуса и точки.

Прошу вашей помощи с регуляркой, которая будет убирать все "неразрешённые символы". В моём случае, разрешены цифры, запятая, минус и точка. Всё остальное запрещено.

Спасибо

vlad_kl 29.06.2021 15:23

Кажется, придумал решение
input.value = input.value.replace(/[^0-9-,.]/g, '');

od0201 29.06.2021 15:27

split(',').join('') не зря там стоят...

нужно преобразовать число в строку используя String()

alert(String(5000).split(',').join('').replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"))


оформите правильно вопром, покажите нерабочий пример

vlad_kl 29.06.2021 15:31

input.value и так строка) зачем оборачивать input.value в String() ???

od0201 29.06.2021 15:44

Цитата:

Сообщение от vlad_kl (Сообщение 538304)
input.value и так строка) зачем оборачивать input.value в String() ???

откуда я знаю как у Вас, покажите рабочий или нерабочий пример

если у вас на выходе текст, то регулярка работает,
'5000'.split(',').join('').replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")


у вас проблема с присваиванием так как на выходе у регулярки текст, Вы не можете вставить текст в input type = number

vlad_kl 29.06.2021 15:48

Да я ж уже написал, что я уже нашёл решение.
Первая регулярка - работает.
Мне нужна была вторая регулярка.
let input = document.querySelector('#input')
input.addEventListener('input', () => {
    input.value = input.value.replace(/[^0-9-,.]/g, '');
    input.value = input.value.split(',').join('').replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
})

od0201 29.06.2021 16:09

сорри , это я не дочитал задание

по вашему коду
найденному решению, немного лишнего
цель:нужно удалить все кроме чисел и '.', и поставить ","
у Вас же
split(',').join('') удаляет ",", это лишнее, так как дальше мы удалим ее
replace(/[^0-9-,.]/g, '') удаляет все, кроме чисел, "," хотя "," не нужна.

оставьте так

let input = document.querySelector('#input')
input.addEventListener('input', () => {   
    input.value = input.value.replace(/[^.0-9]/g,"").replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
})


был бы рабочий или нерабочий пример типа [НTML run]...[/html], потестили бы

Vlasenko Fedor 29.06.2021 16:57

<input is="input-separator" id="test" value=""/>
<button onclick="alert(test.value)">Show value</button>
<script>
    customElements.define('input-separator', class extends HTMLInputElement {
        constructor() {
            super();
            addEventListener('input', _ => {
                this.value = new Intl.NumberFormat('en-GB').format(this.value.replace(/\D+/g, ''));
            })
        }
    }, {extends: 'input'});
</script>

вариант :dance:


Часовой пояс GMT +3, время: 01:37.