Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как изменить регулярное выражение, чтобы принимало минус и плюс (https://javascript.ru/forum/dom-window/57700-kak-izmenit-regulyarnoe-vyrazhenie-chtoby-prinimalo-minus-i-plyus.html)

Эдди 15.08.2015 12:29

Как изменить регулярное выражение, чтобы принимало минус и плюс
 
Не силен я в регулярке. Да и очень редко использую. Тормозная она.
Как вот это выражение дополнить, чтобы кроме цифр, точки и запятой допускало бы еще и ведущие "+" (что не особо надо) и "-" (обязательно):
function isnumber(inp) {
    inp.value = inp.value.replace(/[^\d,.]*/g, '')
                         .replace(/([,.])[,.]+/g, '$1')
                         .replace(/^[^\d]*(\d+([.,]\d{0,5})?).*$/g, '$1');
}

Эдди 15.08.2015 14:09

Цитата:

Сообщение от Rise (Сообщение 384364)
Эдди, что за числа такие, как для первоклашек, с разделителями разрядов?)

А в JS я и есть первоклашка. Потому и спрашиваю.
Спасибо. Проверяю.

Эдди 16.08.2015 10:02

Цитата:

Сообщение от Rise (Сообщение 384365)
Эдди, есть встроенная функция проверки на число (без разделителей разрядов тока):
alert(isFinite('-1.234'));
alert(isFinite('-1.a234'));

Оно-то хорошо, когда уже есть готовое число с ведущим минусом.
А если в инпут начинаешь вводить "-" и перехватываешь по onKeyUp то минус без цифры не воспринимается числом и, соответственно, удаляется.
Ну с запятой вместо точки можно разобраться - val = val.replace(',','.');
А с минусом как?.. Упсссс...
По тупому убирать его до проверки, а потом добавлять? Топорно будет... :)
Хотя работать, наверное, будет быстрее регулярного выражения...

Vlasenko Fedor 16.08.2015 15:08

<input type="text" value="" id="test">
<script>
test.oninput = test.onkeyup = inputFloat;
function inputFloat() {
	this.value = this.value.replace(',', '.');
	if (this.value != '-' &&  !isFinite(this.value)) {
		this.value = parseFloat(this.value) || this.value.slice(0, -1);
	}
}
</script>

Эдди 16.08.2015 15:13

Цитата:

Сообщение от Poznakomlus (Сообщение 384471)
<input type="text" value="" id="test">
<script>
test.oninput = test.onkeyup = inputFloat;
function inputFloat() {
	this.value = this.value.replace(',', '.');
	if (this.value != '-' &&  !isFinite(this.value)) {
		this.value = parseFloat(this.value) || this.value.slice(0, -1);
	}
}
</script>

Запятую не принимает!
Да и точку тоже.

Vlasenko Fedor 16.08.2015 15:33

<input type="text" value="" id="test">
<script>
test.oninput = test.onkeyup = inputFloat;
function inputFloat() {
    this.value = this.value.replace(',', '.');
    if (!/^-?\.?$/.test(this.value)  &&  !isFinite(this.value)) {
        this.value = parseFloat(this.value) || this.value.slice(0, -1);
    }
}
</script>

Эдди 16.08.2015 15:38

Цитата:

Сообщение от Poznakomlus (Сообщение 384475)
<input type="text" value="" id="test">
<script>
test.oninput = test.onkeyup = inputFloat;
function inputFloat() {
    this.value = this.value.replace(',', '.');
    if (!/^-?\.?$/.test(this.value)  &&  !isFinite(this.value)) {
        this.value = parseFloat(this.value) || this.value.slice(0, -1);
    }
}
</script>

Вот спасибо. Наконец, минус принимает.
Хотя не принимает запятую, но с этим я сам разберусь. :)

Vlasenko Fedor 16.08.2015 15:42

Цитата:

Сообщение от Эдди
Хотя не принимает запятую

так я же заменил запятую на строчку
this.value = this.value.replace(',', '.');

А минус и в первом варианте принимал. Единственно что он не понимал в первом это числа типа -.54

Эдди 18.08.2015 17:52

Цитата:

Сообщение от Poznakomlus (Сообщение 384471)
<input type="text" value="" id="test">
<script>
test.oninput = test.onkeyup = inputFloat;
function inputFloat() {
	this.value = this.value.replace(',', '.');
	if (this.value != '-' &&  !isFinite(this.value)) {
		this.value = parseFloat(this.value) || this.value.slice(0, -1);
	}
}
</script>

Вот это другое дело ! Не проверял на своем скрипте, но, думаю, все будет ок. Спасибо.

ksa 19.08.2015 09:51

Цитата:

Сообщение от Эдди
Тормозная она.

Это голословное обвинение... :nono:

Эдди 19.08.2015 14:03

Цитата:

Сообщение от ksa (Сообщение 384758)
Это голословное обвинение... :nono:

Странно. Вообще-то я с ними не дружу и использую крайне редко. Ну, может, для проверки корректности мыла.
Поэтому сам не тестировал, но везде так пишут. Я и поверил.
А разве нет?
А давайте, я проверю.
Вы, если можно, добавьте минус в скрипт, который первый в этой теме.
А я сравню скорость этого скрипта со скоростью того, который привел чуть выше Poznakomlus...

ksa 19.08.2015 14:55

Цитата:

Сообщение от Эдди
чтобы кроме цифр, точки и запятой допускало бы еще и ведущие "+" (что не особо надо) и "-" (обязательно)

Т.е. проверять на
[+|-]<числа>[.<числа>]

Эдди 19.08.2015 14:59

Цитата:

Сообщение от ksa (Сообщение 384803)
Т.е. проверять на
[+|-]<числа>[.<числа>]

Число с плавающей точкой.
Можно вводить только минус (может, плюс, что не важно, потому что без минуса, понятно, что плюс), запятую, точку.

ksa 19.08.2015 15:26

Цитата:

Сообщение от Эдди
Число с плавающей точкой.
Можно вводить только минус (может, плюс, что не важно, потому что без минуса, понятно, что плюс), запятую, точку.

Зачем такие "объяснения"... :blink:
Моя запись верна или нет, вот что требовалось.

Как вариант
var re=/^[+-]?\d+([\.\,]\d+)?$/;
alert(re.test('12345'));
alert(re.test('+12345,123'));
alert(re.test('-12345'));
alert(re.test('12345.'));
alert(re.test('12345.123'));

ksa 19.08.2015 15:31

Цитата:

Сообщение от Эдди
Поэтому сам не тестировал, но везде так пишут. Я и поверил.

Хоть ссылки приведи на написаное... :)

Случаи разные бывают. Допускаю, что неудачная регулярка или некая ситуация даст проигрыш регулярному выражению, в сравнении с альтернативными решениями...

Но возможности регулярок меня лично поражают.
Являясь нативным действием регулярка обязана оперержать по быстродействию другие альтернативные действия и алгоритмы...


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