[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как сделать, чтобы в поле формы вносились цифры?
paa66
В БД есть поле, тип которого float. Есть форма для внесения данных в это поле, вот она (сокращённый вариант):
<form >
<input
name="price" size=55 value="" type="float" id='price' />
</form>
После нажатия ENTER делается проверка, является ли тип данных переменной $price в виде float. Делаю это так:
if (is_float($price)) {}
Т.е., если тип переменной float, то выполняется код, иначе выскакивает надпись: Введите в поле значение в виде цифры! У меня получается, что вводимая в поле цифра воспринимается как тип string. Конечно, я могу преобразовать такую переменную в тип float и казалось бы проблема решена. Но, вдруг вместо "10" пользователь наберёт "десять", тогда преобразованное значение не будет иметь ничего общего с желанием пользователя.
Я порылся по сайтам и нашёл код в js, который позволяет вводить в поле только цифры. Я подумал, что это как раз то, что мне надо. Но попытка запускать код js из php у меня оказалась неудачной. Чем можете помочь?



Спустя 7 минут, 43 секунды (10.02.2012 - 16:47) ApuktaChehov написал(а):
Честно говоря, в первый раз вижу у тега input атрибут type, со значением float.
float - это число с плавающей точкой. Если цифра воспринимается как строка, значит ее нужно привести к числу.

А если юзер наберет звадцать? Вообще, такие вещи решаются запретом вводить чтобы-то ни было, кроме цифр.

Спустя 7 минут, 58 секунд (10.02.2012 - 16:55) paa66 написал(а):
Цитата
в первый раз вижу у тега input атрибут type, со значением float
Я тоже smile.gif Я новичок, поэтому подобного рода ошибки.
Цитата
Если цифра воспринимается как строка, значит ее нужно привести к числу.
Хорошо, если будут вводиться строки в виде чисел, например "10". Мне надо исключить попытки ввода букв.

Спустя 5 минут, 49 секунд (10.02.2012 - 17:01) nugle написал(а):
paa66
Цитата
Мне надо исключить попытки ввода букв.

Вот так
if(!preg_match('#[\d]+#',$val))
echo 'Вводите только цифры';


Для цены советую еще использовать такую вот ф-ию. На выводе из бд, она приводит к типу 990.90 руб.
function converet_the_number($number){
preg_match_all('#([\d]+)[.,]?(\d)*#', $number, $num_arr);

$length = mb_strlen($num_arr[2][0], 'UTF-8');
$number = $num_arr[1][0].'.';
switch($length)
{
case 0: $number .= '00'; break;
case 1: $number .= $num_arr[2][0].'0'; break;
case 2: $number .= $num_arr[2][0]; break;
}
return (string)$number;
}
echo converet_the_number(1.1);

Спустя 9 минут, 11 секунд (10.02.2012 - 17:10) paa66 написал(а):
Цитата
Вот так
Вроде работает.

Спустя 2 минуты, 50 секунд (10.02.2012 - 17:13) nugle написал(а):
Точно работать будет

Спустя 7 секунд (10.02.2012 - 17:13) walerus написал(а):
Перед отправкой формы, проверь что введено в поле или же прямо при вводе данных, можно проверять
<input type="text" size="4" onKeyPress ="if ((event.keyCode < 48) || (event.keyCode > 57)) event.returnValue = false;">


Но тут должен быть обязательно включен JavaScript

Спустя 4 минуты, 48 секунд (10.02.2012 - 17:18) walerus написал(а):
Цитата


if(!preg_match('#[\d]+#',$val))
  echo 'Вводите только цифры';


Это не сработает, если ввести например " abs 12312412.1312 asda "...

Если через регулярку, тогда уже лучше

if( !preg_match( '#^[\d]+$#', trim( $val ) ) )
echo 'Вводите только цифры';

B)

Спустя 2 минуты, 42 секунды (10.02.2012 - 17:20) nugle написал(а):
walerus
смыла нет, так как отключил js отправил форму и у тебя все прошло
Цитата
Это не сработает, если ввести например " abs 12312412.1312 asda "...

Мда, спасибо, а то я уже дня 3 как такого мнения, что сработает, а проверять не хотел, так как был уверен в своих мыслях)

Спустя 7 минут, 2 секунды (10.02.2012 - 17:27) Winston написал(а):
Цитата (walerus @ 10.02.2012 - 16:18)
#^[\d]+$#

#^\d+$#

Символьный класс не обязательно ;)

Спустя 5 минут, 45 секунд (10.02.2012 - 17:33) nugle написал(а):
Winston
мда, все таки надо учить еще больше) спасибо)

Спустя 1 час, 51 минута, 51 секунда (10.02.2012 - 19:25) paa66 написал(а):
Цитата
<input type="text" size="4" onKeyPress ="if ((event.keyCode < 48) || (event.keyCode > 57)) event.returnValue = false;">
Сделал, JavaScript никакой не включал, но кроме цифр вносить в поле другие символы не даёт, что и нужно было. Правда, копейки уже не введёшь (поле float в таблице).
Цитата
Для цены советую еще использовать такую вот ф-ию. На выводе из бд, она приводит к типу 990.90 руб.
Мне наоборот надо для ввода, но код в будущем пригодится, поэтому сохранил. И ещё, Winston сказал, что надо заменить в этой функции

#^[\d]+$#
на
#^\d+$#
, я правильно понял?

Спустя 13 минут, 20 секунд (10.02.2012 - 19:38) nugle написал(а):
paa66
он сказал, что не обезательно символьный класс, то бишь [] можно убрать, так как литерал всего один
Цитата
Мне наоборот надо для ввода

При вводе, например, такое число - 19.50 запишется в бд так - 19.5. А собственно ф-ия для того, чтобы, когда ты из базы достаешь, у тебя было 19.50. Так же и с просто числами, например, 19 на выходе будет представлено так 19.00

Спустя 12 минут, 6 секунд (10.02.2012 - 19:51) paa66 написал(а):
nugle, я понял, что функция просто конвертирует из 19.50 в 19.5 и обратно в 19.50, а я сначала не посмотрел, подумал, что функция (с твоих слов) только для внесения данных в определённом формате.
На самом деле, я не совсем доволен полученным результатом, сами понимаете, что я не могу теперь вносить копейки. Хотя это уже что-то. Я вот думаю даже оставить код nugleа, который пропускает буквы и цифры типа abs 2.1312 , т.к. на мой взгляд такую белиберду вряд ли кто будет набивать, а вот попытку нечаянно текст не в то поле набить, такое может случиться.

Спустя 1 час, 21 минута, 46 секунд (10.02.2012 - 21:12) Игорь_Vasinsky написал(а):
Цитата
<input type="text" size="4" onKeyPress ="if ((event.keyCode < 48) || (event.keyCode > 57)) event.returnValue = false;">


для кроссбраузерности CharCode

Спустя 1 час, 17 минут, 48 секунд (10.02.2012 - 22:30) Winston написал(а):
Цитата (nugle @ 10.02.2012 - 18:38)
литерал всего один

\d - это метасимвол.
Литерал - символ, который не имеет специального значения.
Метасимвол — это символ со специальным значением.

Спустя 6 минут, 28 секунд (10.02.2012 - 22:37) nugle написал(а):
Winston
ну группа литтералов, обозначающихся одним метасимволом)

Спустя 6 минут, 35 секунд (10.02.2012 - 22:43) Winston написал(а):
biggrin.gif

Спустя 8 часов, 50 минут, 14 секунд (11.02.2012 - 07:33) paa66 написал(а):
Цитата
для кроссбраузерности CharCode
Я попробовал заменить keyCode на CharCode в
<input type="text" size="4" onKeyPress ="if ((event.keyCode < 48) || (event.keyCode > 57)) event.returnValue = false;">
и ограничение ввода букв перестало работать. Может, я не туда вставил CharCode?

Спустя 23 минуты, 47 секунд (11.02.2012 - 07:57) nugle написал(а):
paa66
может ты приведешь пример, как ты реализовывал через CharCode, а не через keyCode?

Спустя 32 минуты, 52 секунды (11.02.2012 - 08:30) Игорь_Vasinsky написал(а):
вот же http://www.vasinsky.ru/callback/ - работает

Спустя 16 минут, 41 секунда (11.02.2012 - 08:47) paa66 написал(а):
Цитата
может ты приведешь пример, как ты реализовывал через CharCode, а не через keyCode?
Вот:
<input type="text" size="4" onKeyPress ="if ((event.CharCode < 48) || (event.CharCode > 57)) event.returnValue = false;">

Спустя 1 час, 24 минуты, 23 секунды (11.02.2012 - 10:11) redreem написал(а):
вот кроссбраузерная функция (код 8 - для backspace, по хорошему надо еще довесить кодов на управляющие клавиши):

function checknum(e) {
var keynum; var return2;
if(e.keyCode) { keynum = e.keyCode;} else if (e.which) {keynum = e.which;}
if (keynum < 48 || keynum > 57) {return2 = false; if (keynum == 8) return2 = true;} else return2 = true;
return return2;
};


вот применение:

<input type="text" size="4" onkeypress ="return checknum(event)">




Спустя 2 часа, 43 минуты, 11 секунд (11.02.2012 - 12:54) paa66 написал(а):
redreem, вставил код, работает нормально. Осталось добавить разрешение на внесение точки или запятой. Я так думаю, что надо будет разобраться с ASCII-кодировкой знаков клавиатуры и через
if (keynum == ?) return2 = true;} else return2 = true;
вставить в код в виде исключения.

Спустя 55 минут, 23 секунды (11.02.2012 - 13:50) redreem написал(а):
модифицируй функцию так:

function checknum(e) {
var keynum; var return2;
if(e.keyCode) { keynum = e.keyCode;} else if (e.which) {keynum = e.which;}
alert(keynum);
if (keynum < 48 || keynum > 57) {return2 = false; if (keynum == 8) return2 = true;} else return2 = true;
return return2;
};


выпиши все нужные коды, а потом добав их в условие и все.


function checknum(e) {
var keynum; var return2;
if(e.keyCode) { keynum = e.keyCode;} else if (e.which) {keynum = e.which;}
if (keynum < 48 || keynum > 57) {//это условие проверяет рабочий диапазон символов
return2 = false;
if ((keynum == <допкод1>) || (keynum == <допкод2>) || (keynum == <допкод3>)) return2 = true; //а это условие проверяет дополнительные символы и управляющие клавиши
} else return2 = true;
return return2;
};


а вообще можно все написать короче, если нет необходимости вникать в логику:

function checknum(e) {
if (e.keyCode) var keynum = e.keyCode; else if (e.which) var keynum = e.which;
if (((keynum >= 48) && (keynum <= 57)) || ((keynum == <допкод1>) || (keynum == <допкод2>) || (keynum == <допкод3>))) return true;
return false;
};


или вообще так:

function checknum(e) {
if (e.keyCode) var keynum = e.keyCode; else var keynum = e.which;
return (((keynum >= 48) && (keynum <= 57)) || ((keynum == <допкод1>) || (keynum == <допкод2>) || (keynum == <допкод3>)));
};

Спустя 54 минуты, 35 секунд (11.02.2012 - 14:44) paa66 написал(а):
Выбрал последний вариант как самый короткий, за что спасибо.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.