Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проверка ввода целого или вещественного числа (https://javascript.ru/forum/events/44171-proverka-vvoda-celogo-ili-veshhestvennogo-chisla.html)

martinss 09.01.2014 18:51

Проверка ввода целого или вещественного числа
 
Добрый день.

Я столкнулся с задачей проверки правильности ввода суммы (деньги).
Есть input, в который вводятся значения с клавиатуры.
Необходимо проверить:
1. если ввели цифру, то ОК
2. если ввели точку, то ОК
3. если ввели запятую, конвертировать ее в точку

Далее по законам целого или вещественного числа.
Если число целое, тут все ок - просто цифры.

Если вещественное, то:
1. точка может быть только одна
2. После точки может быть не более 2 цифр
2* экспоненциальную форму не рассматриваем
2** знаки вида + и - не рассматриваем
3. если есть точка, но перед ней пусто, автоматом добавляем ноль.


максимальная длинна числа 15 знаков (вместо с точкой).

Не стоит также забывать, что в input число можно:
1. вставить из буфера (пр кн мыши)
2. CTRL + V
3. перетащить со страницы текст
4. ввести с клавиатуры
4* точку можно поставить в любое место несколько раз (надо быть готовым к такому, поэтому в моем примере slice не очень хорошее решение).


Решение.
я написал регулярку, под которую это, как мне кажется подходит, но не совсем понимаю как ей воспользоваться.

^[1-9]{1}[0-9]{0,8}(\.|\,){0,1}[0-9]{0,2}$


Есть ли у кого дельный совет, я далеко не гуру javascript :)


Вот что я насочинял. Очень прошу помочь, если кто увидит баги :)
Заранее большое спасибо.

$("#chislo").on("blur", function(){
	verify_chislo($(this).val());
});

$("#chislo").on("keypress", function(e){
	verify_chislo($(this).val());
});

$("#chislo").on("keyup", function(){
	verify_chislo($(this).val());
});

$("#chislo").on("change", function(){
	verify_chislo($(this).val());
});


function verify_chislo(ch)
{
	if(isnumber(ch))
	{
		$("#chislo").html(ch  + ' руб.');
	}
	else
	{
		$("#chislo").val(ch.slice(0,-1));
	}
}

function isnumber(param)
{
	if ( param == 0 ) return true;
	return res = (param / param) ? true : false;
}

kostyanet 09.01.2014 22:04

var isNumber = function(n) {
	  return !isNaN(parseFloat(n)) && isFinite(n);
	};


С нац-запятой по обстоятельствам. Если на сервере, то просто превращаете текст в float и пишите в бд float.

kostyanet 09.01.2014 22:06

На сервере типируете по типу поля:

case 4: // float
				case 5: // double
				case 246: // decimal, numeric, fixed
					$value = (float) $value;
				break;


А на клиенте например так

case 246: // decimal, numeric, fixed
					if (!isNumber(value)) 
                                    throw errmsg.number;
					value = parseFloat(value.replace(",", ".")).toFixed(2);
				break;


ЗЫ иденты расползлись...

Цитата:

$("#chislo").html(ch + ' руб.');

А "коп" где? :)


return res = (param / param) ? true : false;



Догадались же! Предлагаю умножать на 1. Или прибавлять 0. Или просто прибавлять. Типа param = +param; Если в параме нет изображения числа, js выдаст NaN. Но есть же научные методы!

kostyanet 09.01.2014 22:21

Кстати, в html5 есть input для чисел.

рони 09.01.2014 23:08

martinss,
Вариант ввод только числа ...
Цитата:

Сообщение от martinss
1. если ввели цифру, то ОК
2. если ввели точку, то ОК
3. если ввели запятую, конвертировать ее в точку

Цитата:

Сообщение от martinss
1. точка может быть только одна
2. После точки может быть не более 2 цифр
2* экспоненциальную форму не рассматриваем
2** знаки вида + и - не рассматриваем
3. если есть точка, но перед ней пусто, автоматом добавляем ноль.

Цитата:

Сообщение от martinss
1. вставить из буфера (пр кн мыши)
2. CTRL + V
3. перетащить со страницы текст
4. ввести с клавиатуры
4* точку можно поставить в любое место

Цитата:

Сообщение от martinss
максимальная длинна числа 15 знаков (вместо с точкой).

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-latest.js"></script>
<title></title>
</head>
<body>
<input name="test" id="test"/>
<script type="text/javascript">
$("#test").on("input blur", function (e) {
    var str = $(this).val(),
        reg = /[\d\.]/,
        str = str.replace(",", ".").replace(/^\./, "0.").replace(/^0(\d)/, "$1"),
        len = 15 < str.length ? 15 : str.length,
        b = 0;
    for (; b < len && reg.test(str.charAt(b)); b++) "." == str.charAt(b) && (reg = /\d/, len = b + 3);
    e.type == "blur" && (str = str.replace(/\.$/, ""))
    $(this).val(str.slice(0, b))
});
</script>
</body>
</html>


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