<form >После нажатия ENTER делается проверка, является ли тип данных переменной $price в виде float. Делаю это так:
<input name="price" size=55 value="" type="float" id='price' />
</form>
if (is_float($price)) {}Т.е., если тип переменной float, то выполняется код, иначе выскакивает надпись: Введите в поле значение в виде цифры! У меня получается, что вводимая в поле цифра воспринимается как тип string. Конечно, я могу преобразовать такую переменную в тип float и казалось бы проблема решена. Но, вдруг вместо "10" пользователь наберёт "десять", тогда преобразованное значение не будет иметь ничего общего с желанием пользователя.
Я порылся по сайтам и нашёл код в js, который позволяет вводить в поле только цифры. Я подумал, что это как раз то, что мне надо. Но попытка запускать код js из php у меня оказалась неудачной. Чем можете помочь?
Спустя 7 минут, 43 секунды (10.02.2012 - 16:47) ApuktaChehov написал(а):
Честно говоря, в первый раз вижу у тега input атрибут type, со значением float.
float - это число с плавающей точкой. Если цифра воспринимается как строка, значит ее нужно привести к числу.
А если юзер наберет звадцать? Вообще, такие вещи решаются запретом вводить чтобы-то ни было, кроме цифр.
float - это число с плавающей точкой. Если цифра воспринимается как строка, значит ее нужно привести к числу.
А если юзер наберет звадцать? Вообще, такие вещи решаются запретом вводить чтобы-то ни было, кроме цифр.
Спустя 7 минут, 58 секунд (10.02.2012 - 16:55) paa66 написал(а):
Цитата |
в первый раз вижу у тега input атрибут type, со значением float |
Я тоже Я новичок, поэтому подобного рода ошибки.
Цитата |
Если цифра воспринимается как строка, значит ее нужно привести к числу. |
Хорошо, если будут вводиться строки в виде чисел, например "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 написал(а):
Перед отправкой формы, проверь что введено в поле или же прямо при вводе данных, можно проверять
Но тут должен быть обязательно включен JavaScript
<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 написал(а):
Цитата |
|
Это не сработает, если ввести например " abs 12312412.1312 asda "...
Если через регулярку, тогда уже лучше
if( !preg_match( '#^[\d]+$#', trim( $val ) ) )
echo 'Вводите только цифры';
B)
Спустя 2 минуты, 42 секунды (10.02.2012 - 17:20) nugle написал(а):
walerus
смыла нет, так как отключил js отправил форму и у тебя все прошло
смыла нет, так как отключил 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 , т.к. на мой взгляд такую белиберду вряд ли кто будет набивать, а вот попытку нечаянно текст не в то поле набить, такое может случиться.
На самом деле, я не совсем доволен полученным результатом, сами понимаете, что я не могу теперь вносить копейки. Хотя это уже что-то. Я вот думаю даже оставить код 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 написал(а):
Спустя 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?
может ты приведешь пример, как ты реализовывал через 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 написал(а):
Выбрал последний вариант как самый короткий, за что спасибо.