텍스트 상자의 "숫자"전용 입력을 제한하는 가장 좋은 방법은 무엇입니까?
소수점을 허용하는 것을 찾고 있습니다.
많은 예를 봅니다. 그러나 어느 것을 사용할 것인지 아직 결정하지 않았습니다.
Praveen Jeganathan에서 업데이트
더 이상 플러그인이 아니라 jQuery는 jQuery.isNumeric()
v1.7에서 자체적으로 추가했습니다. 참조 : https://stackoverflow.com/a/20186188/66767
텍스트 상자의 "숫자"전용 입력을 제한하는 가장 좋은 방법은 무엇입니까?
소수점을 허용하는 것을 찾고 있습니다.
많은 예를 봅니다. 그러나 어느 것을 사용할 것인지 아직 결정하지 않았습니다.
Praveen Jeganathan에서 업데이트
더 이상 플러그인이 아니라 jQuery는 jQuery.isNumeric()
v1.7에서 자체적으로 추가했습니다. 참조 : https://stackoverflow.com/a/20186188/66767
답변:
이에 대한 새롭고 매우 간단한 해결책이 있습니다.
다양한 숫자 필터를 포함 하여 텍스트에 모든 종류의 입력 필터 를 사용할 수 있습니다
<input>
. 이것은 복사 + 붙여 넣기, 드래그 + 드롭, 키보드 단축키, 상황에 맞는 메뉴 작업, 입력 할 수없는 키 및 모든 키보드 레이아웃을 올바르게 처리합니다.
참조 이 대답을 하거나 스스로를 시도 JSFiddle에 .
jquery.numeric 플러그인 으로 많은 양식을 성공적으로 구현했습니다 .
$(document).ready(function(){
$(".numeric").numeric();
});
또한 이것은 텍스트 영역에서도 작동합니다!
그러나 Ctrl + A, 상황에 맞는 메뉴를 통한 복사 + 붙여 넣기 및 드래그 + 드롭은 예상대로 작동 하지 않습니다 .
HTML 5 표준에 대한 광범위한 지원으로 요소의 pattern
속성과 number
유형을 사용 input
하여 숫자 만 입력을 제한 할 수 있습니다. 일부 브라우저 (특히 Chrome)에서는 숫자가 아닌 내용의 붙여 넣기도 제한합니다. 더 자세한 정보 number
및 기타 최신 입력 유형은 여기를 참조하십시오 .
allowDecimal
하여 정수 값만 허용하려고 할 때마다 옵션이 있습니다. 소스는 매우 간단하고 잘 작성되었습니다.
type="number"
.
유효성 검사가 아닌 입력을 제한하려는 경우 주요 이벤트로 작업 할 수 있습니다. 이 같은:
<input type="text" class="numbersOnly" value="" />
과:
jQuery('.numbersOnly').keyup(function () {
this.value = this.value.replace(/[^0-9\.]/g,'');
});
이를 통해 사용자는 유효성 검사 단계에서 나중에 알파벳 문자 등을 입력 할 수 없음을 즉시 알 수 있습니다.
마우스로 잘라서 붙여 넣거나 키 이벤트를 트리거하지 않는 양식 자동 완성 기능을 사용하여 입력 내용을 채울 수 있기 때문에 여전히 유효성 검사를 원할 것입니다.
$doc.on('keyup blur input propertychange', 'input[name="price"]', function(){$(this).val($(this).val().replace(/[^0-9\.]/g,''));});
가장 좋은 대답은 위의 방법이라고 생각했습니다.
jQuery('.numbersOnly').keyup(function () {
this.value = this.value.replace(/[^0-9\.]/g,'');
});
그러나 화살표 키와 삭제 버튼이 커서를 문자열의 끝 부분에 맞추는 것이 약간 고통 스럽다는 것에 동의합니다 (테스트 때문에 나에게 쫓겨났습니다)
나는 간단한 변화를 추가했다
$('.numbersOnly').keyup(function () {
if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
this.value = this.value.replace(/[^0-9\.]/g, '');
}
});
이렇게하면 텍스트가 변경되지 않는 버튼 히트가있는 경우 무시하십시오. 이것으로 당신은 끝까지 점프하지 않고 화살표를 누르고 삭제할 수 있지만 숫자가 아닌 텍스트는 지 웁니다.
keypress
분명히 있기 때문에 더욱,이를 단순화하는 데 사용할 수 있습니다 keyup
및 keydown
트리거 모든 키보드 키 반면, keypress
만 (따라서 "문자"키에 대한 트리거 하지 화살표 및 삭제 키 트리거). 이 답변 참조 : stackoverflow.com/a/1367720/1298685
jquery.numeric 플러그인에는 저자에게 알려주는 몇 가지 버그가 있습니다. Safari와 Opera에서 소수점을 여러 개 사용할 수 있으며 Opera에서 백 스페이스, 화살표 키 또는 기타 여러 제어 문자를 입력 할 수 없습니다. 양의 정수 입력이 필요했기 때문에 결국 내 자신을 작성했습니다.
$(".numeric").keypress(function(event) {
// Backspace, tab, enter, end, home, left, right
// We don't support the del key in Opera because del == . == 46.
var controlKeys = [8, 9, 13, 35, 36, 37, 39];
// IE doesn't support indexOf
var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
// Some browsers just don't raise events for control keys. Easy.
// e.g. Safari backspace.
if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
(49 <= event.which && event.which <= 57) || // Always 1 through 9
(48 == event.which && $(this).attr("value")) || // No 0 first digit
isControlKey) { // Opera assigns values for control keys.
return;
} else {
event.preventDefault();
}
});
더 이상 플러그인 이 아닌 jQuery 는 v1.7에 추가 된 자체 jQuery.isNumeric ()을 구현했습니다 .
jQuery.isNumeric( value )
인수가 숫자인지 확인합니다.
$.isNumeric( "-10" ); // true
$.isNumeric( 16 ); // true
$.isNumeric( 0xFF ); // true
$.isNumeric( "0xFF" ); // true
$.isNumeric( "8e5" ); // true (exponential notation string)
$.isNumeric( 3.1415 ); // true
$.isNumeric( +10 ); // true
$.isNumeric( 0144 ); // true (octal integer literal)
$.isNumeric( "" ); // false
$.isNumeric({}); // false (empty object)
$.isNumeric( NaN ); // false
$.isNumeric( null ); // false
$.isNumeric( true ); // false
$.isNumeric( Infinity ); // false
$.isNumeric( undefined ); // false
다음은 isNumeric ()을 이벤트 리스너와 묶는 방법의 예입니다.
$(document).on('keyup', '.numeric-only', function(event) {
var v = this.value;
if($.isNumeric(v) === false) {
//chop off the last char entered
this.value = this.value.slice(0,-1);
}
});
var v = this.value;
변경하십시오 var v = this.value.replace(/,/g,'');
. 과 같은 숫자 21,345,67.800
도 고려됩니다.
$(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } });
위에서 언급 한 numeric () 플러그인은 Opera에서 작동하지 않습니다 (백 스페이스 키, 백 스페이스 키 또는 포워드 키를 사용할 수 없음).
JQuery 또는 Javascript에서 아래 코드는 완벽하게 작동합니다 (두 줄에 불과합니다).
jQuery :
$(document).ready(function() {
$('.key-numeric').keypress(function(e) {
var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
if (verified) {e.preventDefault();}
});
});
자바 스크립트 :
function isNumeric(e)
{
var keynum = (!window.event) ? e.which : e.keyCode;
return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));
}
물론 이것은 순수한 숫자 입력 (더하기 백 스페이스, 삭제, 앞으로 / 뒤로 키) 전용이지만 포인트와 빼기 문자를 포함하도록 쉽게 변경할 수 있습니다.
number () 메소드 와 함께 유효성 검사 플러그인 을 사용할 수 있습니다 .
$("#myform").validate({
rules: {
field: {
required: true,
number: true
}
}
});
숫자 입력 제한을위한 긴 코드가 필요하지 않습니다.이 코드를 사용해보십시오.
또한 유효한 int & float 값을 받아들입니다.
onload =function(){
var ele = document.querySelectorAll('.number-only')[0];
ele.onkeypress = function(e) {
if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
return false;
}
ele.onpaste = function(e){
e.preventDefault();
}
}
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />
$(function(){
$('.number-only').keypress(function(e) {
if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
})
.on("cut copy paste",function(e){
e.preventDefault();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />
최신 정보
위의 답변은 가장 일반적인 사용 사례에 대한 것입니다-숫자로 입력을 확인하십시오.
아래는 특별한 사용 사례를위한 코드 스 니펫입니다.
$(function(){
$('.number-only').keyup(function(e) {
if(this.value!='-')
while(isNaN(this.value))
this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
.split('').reverse().join('');
})
.on("cut copy paste",function(e){
e.preventDefault();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />
아래는 문자 그대로 키 입력을 차단하는 데 사용하는 것입니다. 숫자 0-9와 소수점 만 허용합니다. 많은 코드가 아니라 구현하기 쉽고 매력처럼 작동합니다.
<script>
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
} else {
return true;
}
}
</script>
<input value="" onkeypress="return isNumberKey(event)">
charCode != 46
있다면 if 문에서 제거하여 소수를 제한 할 수 있습니다 . 좋은 대답입니다!
키 다운시 알파벳의 마법 모양과 사라짐이 보이지 않습니다. 이것은 마우스 페이스트에서도 작동합니다.
$('#txtInt').bind('input propertychange', function () {
$(this).val($(this).val().replace(/[^0-9]/g, ''));
});
/[^0-9.]/g
먼저 jQuery를 사용 하여이 문제를 해결하려고 시도했지만 키 입력시 제거되기 직전에 입력 필드에 원하지 않는 문자 (숫자가 아닌)가 실제로 나타나는 것에 대해서는 만족하지 않았습니다.
다른 해결책을 찾고 이것을 찾았습니다.
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
return oKeyEvent.charCode === 0 ||
/\d/.test(String.fromCharCode(oKeyEvent.charCode));
}
</script>
<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput"
onkeypress="return numbersOnly(this, event);"
onpaste="return false;" /></p>
</form>
출처 : https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example 라이브 예 : http://jsfiddle.net/u8sZq/
단일 소수점을 허용하려면 다음과 같이 할 수 있습니다.
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
var s = String.fromCharCode(oKeyEvent.charCode);
var containsDecimalPoint = /\./.test(oToCheckField.value);
return oKeyEvent.charCode === 0 || /\d/.test(s) ||
/\./.test(s) && !containsDecimalPoint;
}
</script>
출처 : 방금 썼습니다. 작동하는 것 같습니다. 라이브 예 : http://jsfiddle.net/tjBsF/
관심을 가질만한 것들 :
제목이 jQuery 솔루션을 요구한다는 것을 알고 있지만 어쨌든 누군가가 유용 할 것입니다.
게시물 Aaron Aaron Smith에 감사드립니다.
소수점과 숫자의 숫자 부분을 허용하도록 답변을 편집했습니다. 이 작업은 나에게 완벽합니다.
$(".numeric").keypress(function(event) {
// Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
// We don't support the del key in Opera because del == . == 46.
var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
// IE doesn't support indexOf
var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
// Some browsers just don't raise events for control keys. Easy.
// e.g. Safari backspace.
if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
(49 <= event.which && event.which <= 57) || // Always 1 through 9
(96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section
(48 == event.which && $(this).attr("value")) || // No 0 first digit
(96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
isControlKey) { // Opera assigns values for control keys.
return;
} else {
event.preventDefault();
}
});
window.jQuery.fn.ForceNumericOnly =
function () {
return this.each(function () {
$(this).keydown(function (event) {
// Allow: backspace, delete, tab, escape, and enter
if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
// Allow: Ctrl+A
(event.keyCode == 65 && event.ctrlKey === true) ||
// Allow: home, end, left, right
(event.keyCode >= 35 && event.keyCode <= 39)) {
// let it happen, don't do anything
return;
} else {
// Ensure that it is a number and stop the keypress
if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
event.preventDefault();
}
}
});
});
};
그리고 원하는 모든 입력에 적용하십시오.
$('selector').ForceNumericOnly();
2015 년 10 월 현재 CanIUse에 따르면 HTML5는 전역 브라우저 지원 88 % 이상으로 입력 유형 번호를 지원합니다.
<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />
이것은 JQuery 관련 솔루션은 아니지만 휴대 전화에서 Android 키보드가 숫자를 입력하도록 최적화된다는 이점이 있습니다.
또는 새 매개 변수 "pattern"과 함께 입력 유형 텍스트를 사용할 수 있습니다. HTML5 사양에 대한 자세한 내용
이 질문에서 jquery 솔루션이 수천 구분 기호를 지원하지 않기 때문에 jquery 솔루션보다 낫다고 생각합니다. html5를 사용할 수있는 경우
JSFiddle : https://jsfiddle.net/p1ue8qxj/
이 기능은 동일한 작업을 수행하며 위의 아이디어 중 일부를 사용합니다.
$field.keyup(function(){
var val = $j(this).val();
if(isNaN(val)){
val = val.replace(/[^0-9\.]/g,'');
if(val.split('.').length>2) val =val.replace(/\.+$/,"");
}
$j(this).val(val);
});
/ * 이것은 jQuery를 사용하여 HTML 입력 상자에 숫자 (0-9) 만 허용하는 방법의 크로스 브라우저 버전
입니까?
* /
$("#inputPrice").keydown(function(e){
var keyPressed;
if (!e) var e = window.event;
if (e.keyCode) keyPressed = e.keyCode;
else if (e.which) keyPressed = e.which;
var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
// Allow: Ctrl+A
(keyPressed == 65 && e.ctrlKey === true) ||
// Allow: home, end, left, right
(keyPressed >= 35 && keyPressed <= 39)) {
// let it happen, don't do anything
return;
}
else {
// Ensure that it is a number and stop the keypress
if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) {
e.preventDefault();
}
}
});
parseFloat ()를 통해 내용을 실행하십시오. NaN
유효하지 않은 입력으로 돌아갑니다 .
decorplanit.com에서 autoNumeric을 사용할 수 있습니다 . 통화, 반올림 등 숫자를 잘 지원합니다.
CSS 조정이 거의없는 IE6 환경에서 사용했으며 합리적인 성공이었습니다.
예를 들어 CSS 클래스를 numericInput
정의 할 수 있으며 숫자 입력 마스크로 필드를 장식하는 데 사용할 수 있습니다.
autoNumeric 웹 사이트에서 수정 :
$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!
나는 이것이이 문제를 해결하는 좋은 방법이라고 생각하며 매우 간단합니다.
$(function() {
var pastValue, pastSelectionStart, pastSelectionEnd;
$("input").on("keydown", function() {
pastValue = this.value;
pastSelectionStart = this.selectionStart;
pastSelectionEnd = this.selectionEnd;
}).on("input propertychange", function() {
var regex = /^[0-9]+\.?[0-9]*$/;
if (this.value.length > 0 && !regex.test(this.value)) {
this.value = pastValue;
this.selectionStart = pastSelectionStart;
this.selectionEnd = pastSelectionEnd;
}
});
});
예 : JSFiddle
시나리오 다루기
여기에서 가장 유사한 권장 사항은 이들 중 하나 이상에 실패하거나 이러한 모든 시나리오를 다루기 위해 많은 코드가 필요합니다.
home
, end
그리고 arrow
키.delete
와 backspace
어떤 인덱스에 사용되는.keyup
이벤트가 사용되지 않기 때문에 텍스트 값이 깜박 이지 않습니다.시나리오 실패
0.5
0으로 시작 하고 삭제하면 작동하지 않습니다. 텍스트 상자가 소수점으로 시작할 때 (원하는 경우) 정규 표현식을 변경 /^[0-9]*\.?[0-9]*$/
한 다음 흐림 이벤트를 추가하여 이를 해결할 수 있습니다 0
. 이 문제를 해결하는 방법에 대한 자세한 내용은이 고급 시나리오 를 참조하십시오 .플러그인
이 간단한 jquery 플러그인 을 만들어 쉽게 만들었습니다 .
$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);
가장 좋은 방법은 포커스를 잃을 때마다 텍스트 상자의 contects를 확인하는 것입니다.
정규식을 사용하여 내용이 "숫자"인지 확인할 수 있습니다.
또는 기본적으로 자동으로 수행되는 유효성 검사 플러그인을 사용할 수 있습니다.
데이터베이스 사용을 위해이 찾기 코드를 확인하십시오.
function numonly(root){
>>var reet = root.value;
var arr1 = reet.length;
var ruut = reet.charAt(arr1-1);
>>>if (reet.length > 0){
var regex = /[0-9]|\./;
if (!ruut.match(regex)){
var reet = reet.slice(0, -1);
$(root).val(reet);
>>>>}
}
}
//Then use the even handler onkeyup='numonly(this)'
이것은 텍스트 필드에서 정수 백분율 유효성 검사를 위해 방금 수행 한 스 니펫 (Peter Mortensen / Keith Bentrup의 코드 일부 사용)입니다 (jQuery 필요).
/* This validates that the value of the text box corresponds
* to a percentage expressed as an integer between 1 and 100,
* otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e){
if (!isNaN(parseInt(this.value,10))) {
this.value = parseInt(this.value);
} else {
this.value = 0;
}
this.value = this.value.replace(/[^0-9]/g, '');
if (parseInt(this.value,10) > 100) {
this.value = 100;
return;
}
});
이 코드는 :
이것이 도움이 필요한 사람들에게 도움이되기를 바랍니다.
http://ajax911.com/numbers-numeric-field-jquery/ 에서 훌륭한 솔루션을 찾았습니다.
요구 사항에 따라 방금 "keyup"을 "keydown"으로 변경했습니다.
HTML5를 사용하는 경우 유효성 검사를 수행하기 위해 많은 시간을 들일 필요가 없습니다. 그냥 사용하십시오-
<input type="number" step="any" />
step 속성은 소수점을 유효하게합니다.
입력에서 캐럿 위치를 유지하는 다른 방법 :
$(document).ready(function() {
$('.numbersOnly').on('input', function() {
var position = this.selectionStart - 1;
fixed = this.value.replace(/[^0-9\.]/g, ''); //remove all but number and .
if(fixed.charAt(0) === '.') //can't start with .
fixed = fixed.slice(1);
var pos = fixed.indexOf(".") + 1;
if(pos >= 0)
fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', ''); //avoid more than one .
if (this.value !== fixed) {
this.value = fixed;
this.selectionStart = position;
this.selectionEnd = position;
}
});
});
장점 :
플 런커 : 데모 작업
방금 더 나은 플러그인을 찾았습니다. 더 많은 제어 기능을 제공합니다. DOB 필드에 숫자가 필요하지만 "/"또는 "-"문자를 사용할 수 있다고 가정하십시오 .
잘 작동합니다!
http://itgroup.com.ph/alphanumeric/ 에서 확인하십시오 .
$(".numeric").keypress(function(event) {
// Backspace, tab, enter, end, home, left, right
// We don't support the del key in Opera because del == . == 46.
var controlKeys = [8, 9, 13, 35, 36, 37, 39];
// IE doesn't support indexOf
var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
// Some browsers just don't raise events for control keys. Easy.
// e.g. Safari backspace.
if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
(49 <= event.which && event.which <= 57) || // Always 1 through 9
(48 == event.which && $(this).attr("value")) || // No 0 first digit
isControlKey) { // Opera assigns values for control keys.
return;
} else {
event.preventDefault();
}
});
이 코드는 꽤 잘 작동했습니다. 제어 키 배열에 46을 추가해야 마침표를 사용할 수는 있지만 최선의 방법이라고 생각하지는 않습니다.)
나는 이것을 좋은 결과와 함께 사용했다.
ini=$("#id").val();
a=0;
$("#id").keyup(function(e){
var charcode = (e.which) ? e.which : e.keyCode;
// for decimal point
if(!(charcode===190 || charcode===110))
{ // for numeric keys andcontrol keys
if (!((charcode>=33 && charcode<=57) ||
// for numpad numeric keys
(charcode>=96 && charcode<=105)
// for backspace
|| charcode==8))
{
alert("Sorry! Only numeric values allowed.");
$("#id").val(ini);
}
// to include decimal point if first one has been deleted.
if(charcode===8)
{
ini=ini.split("").reverse();
if(ini[0]==".")
a=0;
}
}
else
{
if(a==1)
{
alert("Sorry! Second decimal point not allowed.");
$("#id").val(ini);
}
a=1;
}
ini=$("#id").val();
});
find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes