angularjs: permet de taper seulement des nombres dans une zone de texte

Dans angularjs est-il une fonctionnalité qui permet aux numéros uniquement être tapé dans une zone de texte comme

62
demandé sur Ali Hasan 2013-04-18 23:10:40

21 réponses

cette fonctionnalité est exactement ce dont vous avez besoin. http://docs.angularjs.org/api/ng.directive:input.number

EDIT:

vous pouvez envelopper le plugin jquery en directive. J'ai créé un exemple ici: http://jsfiddle.net/anazimok/jTJCF /

HTML:

<div ng-app="myApp">
    <div>
        <input type="text" min="0" max="99" number-mask="" ng-model="message">
            <button ng-click="handleClick()">Broadcast</button>
    </div>

</div>

CSS:

.ng-invalid {
    border: 1px solid red;
}

JS:

// declare a module
var app = angular.module('myApp', []);

app.directive('numberMask', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            $(element).numeric();
        }
    }
});
22
répondu anazimok 2017-08-15 14:20:33

ce code montre l'exemple pour empêcher d'entrer des symboles non numériques.

angular.module('app').
  directive('onlyDigits', function () {

    return {
        restrict: 'A',
        require: '?ngModel',
        link: function (scope, element, attrs, modelCtrl) {
            modelCtrl.$parsers.push(function (inputValue) {
                if (inputValue == undefined) return '';
                var transformedInput = inputValue.replace(/[^0-9]/g, '');
                if (transformedInput !== inputValue) {
                    modelCtrl.$setViewValue(transformedInput);
                    modelCtrl.$render();
                }
                return transformedInput;
            });
        }
    };
});
61
répondu Anton 2015-10-08 21:08:10

HTML

 <input type="text" name="number" only-digits>

// Tout type 123

  .directive('onlyDigits', 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 !== val) {
              ctrl.$setViewValue(digits);
              ctrl.$render();
            }
            return parseInt(digits,10);
          }
          return undefined;
        }            
        ctrl.$parsers.push(inputValue);
      }
    };
});

// type: 123 ou 123.45

 .directive('onlyDigits', 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 undefined;
        }            
        ctrl.$parsers.push(inputValue);
      }
    };
 });
41
répondu My Mai 2016-02-22 23:49:45

je viens d'utiliser ng-keypress dans la directive pour mon entrée.

HTML:

<input type="text" ng-keypress="filterValue($event)"/>

JS:

$scope.filterValue = function($event){
        if(isNaN(String.fromCharCode($event.keyCode))){
            $event.preventDefault();
        }
};
36
répondu samnau 2015-08-21 20:32:17

c'est le moyen le plus simple et le plus rapide, pour permettre l'entrée du nombre seulement.

<input type="text" id="cardno" placeholder="Enter a Number" onkeypress='return event.charCode >= 48 && event.charCode <= 57' required>

Merci

17
répondu Sijan Gurung 2016-01-14 16:59:21

pour construire un peu sur la réponse d'Anton ...

angular.module("app").directive("onlyDigits", function ()
{
    return {
        restrict: 'EA',
        require: '?ngModel',
        scope:{
            allowDecimal: '@',
            allowNegative: '@',
            minNum: '@',
            maxNum: '@'
        },

        link: function (scope, element, attrs, ngModel)
        {
            if (!ngModel) return;
            ngModel.$parsers.unshift(function (inputValue)
            {
                var decimalFound = false;
                var digits = inputValue.split('').filter(function (s,i)
                {
                    var b = (!isNaN(s) && s != ' ');
                    if (!b && attrs.allowDecimal && attrs.allowDecimal == "true")
                    {
                        if (s == "." && decimalFound == false)
                        {
                            decimalFound = true;
                            b = true;
                        }
                    }
                    if (!b && attrs.allowNegative && attrs.allowNegative == "true")
                    {
                        b = (s == '-' && i == 0);
                    }

                    return b;
                }).join('');
                if (attrs.maxNum && !isNaN(attrs.maxNum) && parseFloat(digits) > parseFloat(attrs.maxNum))
                {
                    digits = attrs.maxNum;
                }
                if (attrs.minNum && !isNaN(attrs.minNum) && parseFloat(digits) < parseFloat(attrs.minNum))
                {
                    digits = attrs.minNum;
                }
                ngModel.$viewValue = digits;
                ngModel.$render();

                return digits;
            });
        }
    };
});
7
répondu Craig 2014-06-30 17:17:21

ma solution accepte copier & coller et enregistrer la position du caret. Il est utilisé pour le coût des produits permet donc des valeurs décimales positives seulement. Peut être refactor très facile pour permettre des chiffres négatifs ou juste entiers.

angular
        .module("client")
        .directive("onlyNumber", function () {
            return {
                restrict: "A",
                link: function (scope, element, attr) {
                    element.bind('input', function () {
                        var position = this.selectionStart - 1;

                        //remove all but number and .
                        var fixed = this.value.replace(/[^0-9\.]/g, '');  
                        if (fixed.charAt(0) === '.')                  //can't start with .
                            fixed = fixed.slice(1);

                        var pos = fixed.indexOf(".") + 1;
                        if (pos >= 0)               //avoid more than one .
                            fixed = fixed.substr(0, pos) + fixed.slice(pos).replace('.', '');  

                        if (this.value !== fixed) {
                            this.value = fixed;
                            this.selectionStart = position;
                            this.selectionEnd = position;
                        }
                    });
                }
            };
        });

mettre sur la page html:

<input type="text" class="form-control" only-number ng-model="vm.cost" />
6
répondu Carlos Toledo 2016-09-14 19:03:21

basé sur djsiz solution, enveloppée dans la directive. NOTE: il ne traitera pas les nombres numériques, mais il peut être facilement mis à jour

angular
        .module("app")
        .directive("mwInputRestrict", [
            function () {
                return {
                    restrict: "A",
                    link: function (scope, element, attrs) {
                        element.on("keypress", function (event) {
                            if (attrs.mwInputRestrict === "onlynumbers") {
                                // allow only digits to be entered, or backspace and delete keys to be pressed
                                return (event.charCode >= 48 && event.charCode <= 57) ||
                                       (event.keyCode === 8 || event.keyCode === 46);
                            }
                            return true;
                        });
                    }
                }
            }
        ]);

HTML

 <input type="text"
        class="form-control"
        id="inputHeight"
        name="inputHeight"
        placeholder="Height"
        mw-input-restrict="onlynumbers"
        ng-model="ctbtVm.dto.height">
3
répondu igorGIS 2016-07-13 12:46:59

C'est la méthode qui fonctionne pour moi. Il est basé dans samnau anwser mais permet de soumettre le formulaire avec ENTER , augmenter et diminuer le nombre avec UP et DOWN flèches, édition avec DEL , BACKSPACE , LEFT et RIGHT , et naviguer dans les champs creux avec TAB . Notez qu'il fonctionne pour des entiers positifs tels qu'un montant.

HTML:

<input ng-keypress="onlyNumbers($event)" min="0" type="number" step="1" ng-pattern="/^[0-9]{1,8}$/" ng-model="... >

ANGULARJS:

$scope.onlyNumbers = function(event){   
    var keys={
        'up': 38,'right':39,'down':40,'left':37,
        'escape':27,'backspace':8,'tab':9,'enter':13,'del':46,
        '0':48,'1':49,'2':50,'3':51,'4':52,'5':53,'6':54,'7':55,'8':56,'9':57
    };
    for(var index in keys) {
        if (!keys.hasOwnProperty(index)) continue;
        if (event.charCode==keys[index]||event.keyCode==keys[index]) {
            return; //default event
        }
    }   
    event.preventDefault();
};
2
répondu Leopoldo Sanczyk 2016-03-06 05:18:56

utilisez simplement HTML5

<input type="number" min="0"/>
2
répondu Rohidas Kadam 2016-12-29 13:31:28

vous pouvez vérifier https://github.com/rajesh38/ng-only-number

  1. il restreint l'entrée aux seuls nombres et décimales dans une zone de texte en tapant.
  2. vous pouvez limiter le nombre de chiffres à autoriser avant et après le point décimal
  3. il efface également les chiffres après le point décimal si le point décimal est supprimé de la zone de texte par exemple si vous avez mis 123.45 et puis supprimer le point décimal il supprimera également les chiffres de fuite après le point décimal et le fera 123.
1
répondu Rajesh Paul 2015-12-25 19:29:29

vous pourriez faire quelque chose comme ça: Utiliser ng-pattern avec le RegExp " /^[0-9]+$/ " cela signifie que seuls les nombres entiers sont valides.

<form novalidate name="form">
    <input type="text" data-ng-model="age" id="age" name="age" ng-pattern="/^[0-9]+$/">
    <span ng-show="form.age.$error.pattern">The value is not a valid integer</span>
</form>
1
répondu Victor Oliveira 2016-09-16 19:53:45

cette solution n'accepte que les caractères numériques,"."et" -

aussi cela restreint l'entrée d'espace sur la zone de texte. J'avais utilisé la directive pour obtenir la même chose.

s'il vous Plaît avoir la solution ci-dessous exemple de travail.

http://jsfiddle.net/vfsHX/2697/

HTML:

<form ng-app="myapp" name="myform" novalidate> 
<div ng-controller="Ctrl">
<input name="number" is-number ng-model="wks.number">
<span ng-show="!wks.validity">Value is invalid</span>
</div>

JS:

var $scope;
var app = angular.module('myapp', []);

app.controller('Ctrl', function($scope) {
    $scope.wks =  {number: 1, validity: true}
});

app.directive('isNumber', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {   
        element.bind("keydown keypress", function (event) {
          if(event.which === 32) {
            event.returnValue = false;
            return false;
          }
       }); 
            scope.$watch(attrs.ngModel, function(newValue,oldValue) {
                var arr = String(newValue).split("");
                if (arr.length === 0) return;
                if (arr.length === 1 && (arr[0] == '-' || arr[0] === '.' )) return;
                if (arr.length === 2 && newValue === '-.') return;
                if (isNaN(newValue)) {
                    //scope.wks.number = oldValue;
                    ngModel.$setViewValue(oldValue);
                                    ngModel.$render();
                }
            });

        }
    };
});
1
répondu Suven Sekhar 2017-02-13 10:27:54

c'est simple et compréhensible. Il suffit de copier coller ce code et votre problème sera résolu.Pour plus de conditions, il suffit de changer la valeur dans le modèle.et votre travail sera fait.

<input type="text"  pattern="[0-9]{0,}" oninvalid="this.setCustomValidity('Please enter only numeric value. Special character are not allowed.')" oninput="setCustomValidity('')">
1
répondu 2017-09-20 12:01:41

j'ai eu un problème similaire et fini par accrocher et de l'événement

ng-change="changeCount()" 

puis:

self.changeCount = function () {
      if (!self.info.itemcount) {
        self.info.itemcount = 1;
      }
 };

de sorte que l'utilisateur est par défaut à 1 si un nombre invalide est inséré.

0
répondu leeroya 2016-05-26 09:40:21

je arraged le jQuery dans ce

.directive('numbersCommaOnly', function(){
   return {
     require: 'ngModel',
     link: function (scope, element, attrs, ngModel) {

        element.on('keydown', function(event) {                  
            // Allow: backspace, delete, tab, escape, enter and .
            var array2 = [46, 8, 9, 27, 13, 110, 190]
            if (array2.indexOf(event.which) !== -1 ||
                 // Allow: Ctrl+A
                (event.which == 65 && event.ctrlKey === true) ||
                 // Allow: Ctrl+C
                (event.which == 67 && event.ctrlKey === true) ||
                 // Allow: Ctrl+X
                (event.which == 88 && event.ctrlKey === true) ||
                 // Allow: home, end, left, right
                (event.which >= 35 && event.which <= 39)) {
                     // let it happen, don't do anything
                     return;
            }
            // Ensure that it is a number and stop the keypress
            if ((event.shiftKey || (event.which < 48 || event.which > 57)) && (event.which < 96 || event.which > 105)) {
                event.preventDefault();
            }
         });

     }
   };
})
0
répondu plampot 2017-05-23 12:18:18
 <input type="text" ng-keypress="checkNumeric($event)"/>
 //inside controller
 $scope.dot = false
 $scope.checkNumeric = function($event){
 if(String.fromCharCode($event.keyCode) == "." && !$scope.dot){
    $scope.dot = true
 }
 else if( isNaN(String.fromCharCode($event.keyCode))){
   $event.preventDefault();
 }
0
répondu Ramesh Ramasamy 2018-01-27 12:13:41

je sais que c'est un vieux post mais cette adaptation de mon Mai 'S réponse fonctionne bien pour moi...

angular.module("app").directive("numbersOnly", function() {
  return {
    require: "ngModel",
    restrict: "A",
    link: function(scope, element, attr, ctrl) {
        function inputValue(val) {
            if (val) {
                //transform val to a string so replace works
                var myVal = val.toString();

                //replace any non numeric characters with nothing
                var digits = myVal.replace(/\D/g, "");

                //if anything needs replacing - do it!
                if (digits !== myVal) {
                    ctrl.$setViewValue(digits);
                    ctrl.$render();
                }
                return parseFloat(digits);
            }
            return undefined;
        }
        ctrl.$parsers.push(inputValue);
    }
  };
});
0
répondu Janey 2018-03-16 15:05:22

j'ai fait à

.js

$scope.numberOnly="(^[0-9]+$)";

.html

<input type="text" name="rollNo" ng-model="stud.rollNo" ng-pattern="numberOnly" ng-maxlength="10" maxlength="10" md-maxlength="10" ng-required="true" >
0
répondu Nilesh Panchal 2018-04-13 14:17:50

utiliser ng-only-number pour ne permettre que les nombres, par exemple:

<input type="text" ng-only-number data-max-length=5>
-1
répondu Suresh K 2017-08-31 16:02:12
 <input
    onkeypress="return (event.charCode >= 48 && event.charCode <= 57) ||                         
    event.charCode == 0 || event.charCode == 46">
-1
répondu rakib 2018-03-19 18:10:10