Проверка ввода целого или вещественного числа
Добрый день.
Я столкнулся с задачей проверки правильности ввода суммы (деньги). Есть 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;
}
|
var isNumber = function(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
};
С нац-запятой по обстоятельствам. Если на сервере, то просто превращаете текст в float и пишите в бд float. |
На сервере типируете по типу поля:
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;
ЗЫ иденты расползлись... Цитата:
А "коп" где? :) return res = (param / param) ? true : false; Догадались же! Предлагаю умножать на 1. Или прибавлять 0. Или просто прибавлять. Типа param = +param; Если в параме нет изображения числа, js выдаст NaN. Но есть же научные методы! |
Кстати, в html5 есть input для чисел.
|
martinss,
Вариант ввод только числа ... Цитата:
Цитата:
Цитата:
Цитата:
<!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, время: 11:43. |