숫자만 입력하도록 제한하려면 어떻게 해야 하나요?
ngChange in Angular를 사용하고 있습니다.JS - 사용자가 입력에 추가한 문자를 제거하는 사용자 지정 함수를 트리거합니다.
<input type="text" name="inputName" data-ng-change="numbersOnly()"/>
문제는 트리거된 입력을 대상으로 해야 한다는 것입니다.numbersOnly()
입력된 글자를 삭제할 수 있도록 합니다.구글을 오랫동안 찾아봤지만 아무것도 찾을 수 없었습니다.
내가 뭘 할 수 있을까?
사용 사례에 적합한 경우 type="number"를 사용하십시오.
<input type="number" ng-model="myText" name="inputName">
또 하나의 간단한 방법:ng-pattern을 사용하여 필드에서 허용되는 것을 제한하는 regex를 정의할 수도 있습니다.양식에 대한 "쿡북" 페이지도 참조하십시오.
해킹? 컨트롤러의 ng-model을 $watch합니다.
<input type="text" ng-model="myText" name="inputName">
컨트롤러:
$scope.$watch('myText', function() {
// put numbersOnly() logic here, e.g.:
if ($scope.myText ... regex to look for ... ) {
// strip out the non-numbers
}
})
명령어에 $parser를 사용하는 것이 가장 좋습니다.@pkozlowski.seconsource에 의해 제공된 이미 양호한 답변을 반복하지 않습니다.이 링크는 다음과 같습니다.
위의 모든 솔루션은 ng-model을 사용하는 것을 수반하며, 이러한 방법을 통해this
불필요.
ng-change를 사용하면 문제가 발생합니다."각" 참조JS - $scope.value 리셋으로 템플릿 값이 변경되지 않음(랜덤 동작)
사용.ng-pattern
텍스트 필드:
<input type="text" ng-model="myText" name="inputName" ng-pattern="onlyNumbers">
그런 다음 컨트롤러에 포함시킵니다.
$scope.onlyNumbers = /^\d+$/;
여기 이 구현이 있습니다.$parser
@Mark Rajcok이 추천하는 최적의 방법입니다.기본적으로는 @pkozlowski.opensource의 뛰어난 텍스트 응답용 $parser이지만 숫자만 허용하도록 고쳐 씁니다.모든 공로를 그에게 돌리세요.이것은 단지 당신이 답을 읽고 다시 쓰는 데 드는 5분의 시간을 절약하기 위한 것입니다.
app.directive('numericOnly', function(){
return {
require: 'ngModel',
link: function(scope, element, attrs, modelCtrl) {
modelCtrl.$parsers.push(function (inputValue) {
var transformedInput = inputValue ? inputValue.replace(/[^\d.-]/g,'') : null;
if (transformedInput!=inputValue) {
modelCtrl.$setViewValue(transformedInput);
modelCtrl.$render();
}
return transformedInput;
});
}
};
});
그리고 이렇게 쓰죠.
<input type="text" name="number" ng-model="num_things" numeric-only>
흥미롭게도 영숫자로 둘러싸이지 않는 한 공간은 파서에 도달하지 않습니다.따라서 다음과 같이 해야 합니다..trim()
필요에 따라서,또, 이 파서는, 다음의 서버에서는 동작하지 않습니다.<input type="number">
어떤 이유에서인지 비숫자는 파서에 도달하지 못하고 파서는 삭제되지만 입력 제어 자체에 도달합니다.
제안된 솔루션 중 어느 것도 제게는 효과가 없었고, 몇 시간 후에 마침내 방법을 찾았습니다.
각도 지시어는 다음과 같습니다.
angular.module('app').directive('restrictTo', function() {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var re = RegExp(attrs.restrictTo);
var exclude = /Backspace|Enter|Tab|Delete|Del|ArrowUp|Up|ArrowDown|Down|ArrowLeft|Left|ArrowRight|Right/;
element[0].addEventListener('keydown', function(event) {
if (!exclude.test(event.key) && !re.test(event.key)) {
event.preventDefault();
}
});
}
}
});
입력 내용은 다음과 같습니다.
<input type="number" min="0" name="inputName" ng-model="myModel" restrict-to="[0-9]">
정규 표현은 누른 키를 평가하며 값은 평가하지 않습니다.
입력에도 완벽하게 대응합니다.type="number"
왜냐하면 값이 변경되지 않기 때문에 키가 표시되지 않고 모델에 영향을 주지 않기 때문입니다.
에서는 숫자 꽤 .input
:
<input type="text" ng-model="myText" name="inputName" onkeypress='return event.charCode >= 48 && event.charCode <= 57'/>
여기에는 몇 가지 방법이 있습니다.
하면 .type="number"
:
<input type="number" />
또는 정규식을 사용하는 재사용 가능한 지시문을 만들었습니다.
HTML
<div ng-app="myawesomeapp">
test: <input restrict-input="^[0-9-]*$" maxlength="20" type="text" class="test" />
</div>
자바스크립트
;(function(){
var app = angular.module('myawesomeapp',[])
.directive('restrictInput', [function(){
return {
restrict: 'A',
link: function (scope, element, attrs) {
var ele = element[0];
var regex = RegExp(attrs.restrictInput);
var value = ele.value;
ele.addEventListener('keyup',function(e){
if (regex.test(ele.value)){
value = ele.value;
}else{
ele.value = value;
}
});
}
};
}]);
}());
위의 솔루션들은 모두 꽤 크기 때문에 나는 이것에 대해 2센트를 주고 싶었다.
입력된 값이 숫자인지 확인하고 공백이 아닌지 확인하는 것뿐입니다.
html은 다음과 같습니다.
<input type="text" ng-keypress="CheckNumber()"/>
JS는 다음과 같습니다.
$scope.CheckKey = function () {
if (isNaN(event.key) || event.key === ' ' || event.key === '') {
event.returnValue = '';
}
};
아주 간단해요.
난 이게 페이스트토에 효과가 없을 거라 믿어, 알려지게.
Paste의 경우 onChange 이벤트를 사용하여 tamme와 같은 문자열 전체를 해석해야 합니다.이것은 입력 전용입니다.
붙여넣기 업데이트: 다음 JS 함수를 추가합니다.
$scope.CheckPaste = function () {
var paste = event.clipboardData.getData('text');
if (isNaN(paste)) {
event.preventDefault();
return false;
}
};
html 입력에 트리거가 추가됩니다.
<input type="text" ng-paste="CheckPaste()"/>
이것이 도움이 되기를 바랍니다.
여기 Plunker가 처리하지 않는 제안 이상의 상황을 처리합니다.
$및 $type=formatters for $foramers 파 ==== type="number"를
다음으로 문제/솔루션(플런커에서도 이용 가능)에 대한 설명을 나타냅니다.
/*
*
* Limit input text for floating numbers.
* It does not display characters and can limit the Float value to X numbers of integers and X numbers of decimals.
* min and max attributes can be added. They can be Integers as well as Floating values.
*
* value needed | directive
* ------------------------------------
* 55 | max-integer="2"
* 55.55 | max-integer="4" decimal="2" (decimals are substracted from total length. Same logic as database NUMBER type)
*
*
* Input type="number" (HTML5)
*
* Browser compatibility for input type="number" :
* Chrome : - if first letter is a String : allows everything
* - if first letter is a Integer : allows [0-9] and "." and "e" (exponential)
* Firefox : allows everything
* Internet Explorer : allows everything
*
* Why you should not use input type="number" :
* When using input type="number" the $parser pipeline of ngModel controller won't be able to access NaN values.
* For example : viewValue = '1e' -> $parsers parameter value = "".
* This is because undefined values are not allowes by default (which can be changed, but better not do it)
* This makes it impossible to modify the view and model value; to get the view value, pop last character, apply to the view and return to the model.
*
* About the ngModel controller pipelines :
* view value -> $parsers -> model value
* model value -> $formatters -> view value
*
* About the $parsers pipeline :
* It is an array of functions executed in ascending order.
* When used with input type="number" :
* This array has 2 default functions, one of them transforms the datatype of the value from String to Number.
* To be able to change the value easier (substring), it is better to have access to a String rather than a Number.
* To access a String, the custom function added to the $parsers pipeline should be unshifted rather than pushed.
* Unshift gives the closest access to the view.
*
* About the $formatters pipeline :
* It is executed in descending order
* When used with input type="number"
* Default function transforms the value datatype from Number to String.
* To access a String, push to this pipeline. (push brings the function closest to the view value)
*
* The flow :
* When changing ngModel where the directive stands : (In this case only the view has to be changed. $parsers returns the changed model)
* -When the value do not has to be modified :
* $parsers -> $render();
* -When the value has to be modified :
* $parsers(view value) --(does view needs to be changed?) -> $render();
* | |
* | $setViewValue(changedViewValue)
* | |
* --<-------<---------<--------<------
*
* When changing ngModel where the directive does not stand :
* - When the value does not has to be modified :
* -$formatters(model value)-->-- view value
* -When the value has to be changed
* -$formatters(model vale)-->--(does the value has to be modified) -- (when loop $parsers loop is finished, return modified value)-->view value
* |
* $setViewValue(notChangedValue) giving back the non changed value allows the $parsers handle the 'bad' value
* | and avoids it to think the value did not changed
* Changed the model <----(the above $parsers loop occurs)
*
*/
<input type="text" name="profileChildCount" id="profileChildCount" ng-model="profile.ChildCount" numeric-only maxlength="1" />
숫자만의 Atribute를 사용할 수 있습니다.
십진수
directive('decimal', function() {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, element, attr, ctrl) {
function inputValue(val) {
if (val) {
var digits = val.replace(/[^0-9.]/g, '');
if (digits.split('.').length > 2) {
digits = digits.substring(0, digits.length - 1);
}
if (digits !== val) {
ctrl.$setViewValue(digits);
ctrl.$render();
}
return parseFloat(digits);
}
return "";
}
ctrl.$parsers.push(inputValue);
}
};
});
숫자
directive('entero', function() {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, element, attr, ctrl) {
function inputValue(val) {
if (val) {
var value = val + ''; //convert to string
var digits = value.replace(/[^0-9]/g, '');
if (digits !== value) {
ctrl.$setViewValue(digits);
ctrl.$render();
}
return parseInt(digits);
}
return "";
}
ctrl.$parsers.push(inputValue);
}
};
});
오래된 방법인 건 알지만, 쉬운 해결책을 찾는 사람이 있을 때를 대비해서 이 목적을 위한 지침을 만들었습니다.매우 사용하기 쉽다.
여기서 확인하실 수 있습니다.
입력 시작 부분에서 0을 제거할 수도 있습니다.아직 코멘트를 할 수 없기 때문에 위의 Mordred 답변에 if 블록을 추가합니다.
app.directive('numericOnly', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, modelCtrl) {
modelCtrl.$parsers.push(function (inputValue) {
var transformedInput = inputValue ? inputValue.replace(/[^\d.-]/g,'') : null;
if (transformedInput!=inputValue) {
modelCtrl.$setViewValue(transformedInput);
modelCtrl.$render();
}
//clear beginning 0
if(transformedInput == 0){
modelCtrl.$setViewValue(null);
modelCtrl.$render();
}
return transformedInput;
});
}
};
})
이거 드셔보세요.
<input ng-keypress="validation($event)">
function validation(event) {
var theEvent = event || window.event;
var key = theEvent.keyCode || theEvent.which;
key = String.fromCharCode(key);
var regex = /[0-9]|\./;
if (!regex.test(key)) {
theEvent.returnValue = false;
if (theEvent.preventDefault) theEvent.preventDefault();
}
}
솔루션: 앱의 모든 입력, 숫자, 텍스트, 기타 모든 항목에 대해 지시사항을 작성하므로 사용자가 값을 입력하고 이벤트를 변경할 수 있습니다.각진 6을 만들어라.
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
// tslint:disable-next-line:directive-selector
selector: 'input[inputType]'
})
export class InputTypeDirective {
constructor(private _el: ElementRef) {}
@Input() inputType: string;
// tipos: number, letter, cuit, tel
@HostListener('input', ['$event']) onInputChange(event) {
if (!event.data) {
return;
}
switch (this.inputType) {
case 'number': {
const initalValue = this._el.nativeElement.value;
this._el.nativeElement.value = initalValue.replace(/[^0-9]*/g, '');
if (initalValue !== this._el.nativeElement.value) {
event.stopPropagation();
}
break;
}
case 'text': {
const result = event.data.match(/[^a-zA-Z Ññ]*/g);
if (result[0] !== '') {
const initalValue = this._el.nativeElement.value;
this._el.nativeElement.value = initalValue.replace(
/[^a-zA-Z Ññ]*/g,
''
);
event.stopPropagation();
}
break;
}
case 'tel':
case 'cuit': {
const initalValue = this._el.nativeElement.value;
this._el.nativeElement.value = initalValue.replace(/[^0-9-]*/g, '');
if (initalValue !== this._el.nativeElement.value) {
event.stopPropagation();
}
}
}
}
}
HTML
<input matInput inputType="number" [formControlName]="field.name" [maxlength]="field.length" [placeholder]="field.label | translate" type="text" class="filter-input">
기본 HTML
<input type="number" />
기본 부트스트랩
<input class="form-control" type="number" value="42" id="my-id">
결국 위의 코드를 수정하여 입력을 받아들이고 포맷을 즉시 변경하게 되었습니다.
.directive('numericOnly', function($filter) {
return {
require: 'ngModel',
link: function(scope, element, attrs, modelCtrl) {
element.bind('keyup', function (inputValue, e) {
var strinput = modelCtrl.$$rawModelValue;
//filter user input
var transformedInput = strinput ? strinput.replace(/[^,\d.-]/g,'') : null;
//remove trailing 0
if(transformedInput.charAt(0) <= '0'){
transformedInput = null;
modelCtrl.$setViewValue(transformedInput);
modelCtrl.$render();
}else{
var decimalSplit = transformedInput.split(".")
var intPart = decimalSplit[0];
var decPart = decimalSplit[1];
//remove previously formated number
intPart = intPart.replace(/,/g, "");
//split whole number into array of 3 digits
if(intPart.length > 3){
var intDiv = Math.floor(intPart.length / 3);
var strfraction = [];
var i = intDiv,
j = 3;
while(intDiv > 0){
strfraction[intDiv] = intPart.slice(intPart.length-j,intPart.length - (j - 3));
j=j+3;
intDiv--;
}
var k = j-3;
if((intPart.length-k) > 0){
strfraction[0] = intPart.slice(0,intPart.length-k);
}
}
//join arrays
if(strfraction == undefined){ return;}
var currencyformat = strfraction.join(',');
//check for leading comma
if(currencyformat.charAt(0)==','){
currencyformat = currencyformat.slice(1);
}
if(decPart == undefined){
modelCtrl.$setViewValue(currencyformat);
modelCtrl.$render();
return;
}else{
currencyformat = currencyformat + "." + decPart.slice(0,2);
modelCtrl.$setViewValue(currencyformat);
modelCtrl.$render();
}
}
});
}
};
})
<input type="text" ng-model="employee.age" valid-input input-pattern="[^0-9]+" placeholder="Enter an age" />
<script>
var app = angular.module('app', []);
app.controller('dataCtrl', function($scope) {
});
app.directive('validInput', function() {
return {
require: '?ngModel',
scope: {
"inputPattern": '@'
},
link: function(scope, element, attrs, ngModelCtrl) {
var regexp = null;
if (scope.inputPattern !== undefined) {
regexp = new RegExp(scope.inputPattern, "g");
}
if(!ngModelCtrl) {
return;
}
ngModelCtrl.$parsers.push(function(val) {
if (regexp) {
var clean = val.replace(regexp, '');
if (val !== clean) {
ngModelCtrl.$setViewValue(clean);
ngModelCtrl.$render();
}
return clean;
}
else {
return val;
}
});
element.bind('keypress', function(event) {
if(event.keyCode === 32) {
event.preventDefault();
}
});
}
}}); </script>
언급URL : https://stackoverflow.com/questions/14615236/how-do-i-restrict-an-input-to-only-accept-numbers
'programing' 카테고리의 다른 글
지난 30일 동안 데이터를 가져오기 위한 SQL 쿼리? (0) | 2023.02.23 |
---|---|
각도 리소스에 의해 2D로 해석되는 문자열의 1차원 배열 (0) | 2023.02.23 |
리액트 네이티브 모듈 테스트 방법 (0) | 2023.02.23 |
ESLint - TypeScript용 "no-used-vars" 설정 (0) | 2023.02.23 |
네이티브 SQL 스크립트를 JPA/Hibernate에서 실행하려면 어떻게 해야 합니까? (0) | 2023.02.23 |