如何只允许在输入中输入数字(数字和小数点)?

use*_*811 58 angularjs angularjs-directive

我是angularjs的新手.我想知道只允许在文本框中输入有效数字的方法是什么.例如,用户可以输入"1.25",但不能输入"1.a"或"1 ..".当用户尝试输入将使其成为无效数字的下一个字符时,他无法输入.

提前致谢.

Ada*_*mas 104

我编写了一个有效的CodePen示例来演示过滤数字用户输入的好方法.该指令目前只允许正整数,但可以很容易地更新正则表达式以支持任何所需的数字格式.

我的指令很容易使用:

<input type="text" ng-model="employee.age" valid-number />
Run Code Online (Sandbox Code Playgroud)

该指令很容易理解:

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

app.controller('MainCtrl', function($scope) {
});

app.directive('validNumber', function() {
  return {
    require: '?ngModel',
    link: function(scope, element, attrs, ngModelCtrl) {
      if(!ngModelCtrl) {
        return; 
      }

      ngModelCtrl.$parsers.push(function(val) {
        if (angular.isUndefined(val)) {
            var val = '';
        }
        var clean = val.replace( /[^0-9]+/g, '');
        if (val !== clean) {
          ngModelCtrl.$setViewValue(clean);
          ngModelCtrl.$render();
        }
        return clean;
      });

      element.bind('keypress', function(event) {
        if(event.keyCode === 32) {
          event.preventDefault();
        }
      });
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

我想强调的是,将模型引用保留在指令之外是很重要的.

我希望你觉得这有帮助.

非常感谢Sean Christe和Chris Grimes向我介绍了ngModelController

  • 如何使用`input type ="number"`来完成这项工作? (18认同)
  • 另外如何更新以允许`-`和`.`? (3认同)
  • 爱它亚当.但是对于@bbodenmiller的观点,为什么这只适用于type ="text",它打破了`type ="number"`:(无论如何都喜欢它! (2认同)
  • 谢谢 - 工作很棒.我想你需要从这一行中删除"var":if(angular.isUndefined(val)){var val =''; } (2认同)

Gor*_*dyD 52

您可以尝试使用此指令来阻止将任何无效字符输入到输入字段中.(更新:这取决于具有模型明确知识的指令,这对于可重用性不是理想的,请参阅下面的可重用示例)

app.directive('isNumber', function () {
    return {
        require: 'ngModel',
        link: function (scope) {    
            scope.$watch('wks.number', 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;
                }
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

它还解释了这些情况:

  1. 从非空有效字符串转到空字符串
  2. 负值
  3. 负十进制值

我在这里创建了一个jsFiddle,你可以看到它是如何工作的.

UPDATE

关于Adam Thomas关于不直接在指令中包含模型引用的反馈(我也认为这是最好的方法),我已经更新了我的jsFiddle以提供一种不依赖于此的方法.

该指令使用局部范围与父范围的双向绑定.对指令内部变量所做的更改将反映在父作用域中,反之亦然.

HTML:

<form ng-app="myapp" name="myform" novalidate> 
    <div ng-controller="Ctrl">
        <number-only-input input-value="wks.number" input-name="wks.name"/>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

角度代码:

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

app.controller('Ctrl', function($scope) {
    $scope.wks =  {number: 1, name: 'testing'};
});
app.directive('numberOnlyInput', function () {
    return {
        restrict: 'EA',
        template: '<input name="{{inputName}}" ng-model="inputValue" />',
        scope: {
            inputValue: '=',
            inputName: '='
        },
        link: function (scope) {
            scope.$watch('inputValue', 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.inputValue = oldValue;
                }
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)


jam*_*rnj 44

首先非常感谢Adam thomas 我使用了相同的Adam的逻辑,并通过一个小的修改来接受十进制值.

注意:这将允许只有2个十进制值的数字

这是我的工作示例

HTML

<input type="text" ng-model="salary" valid-number />
Run Code Online (Sandbox Code Playgroud)

使用Javascript

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

    app.controller('MainCtrl', function($scope) {
    });

    app.directive('validNumber', function() {
      return {
        require: '?ngModel',
        link: function(scope, element, attrs, ngModelCtrl) {
          if(!ngModelCtrl) {
            return; 
          }

          ngModelCtrl.$parsers.push(function(val) {
            if (angular.isUndefined(val)) {
                var val = '';
            }
            var clean = val.replace(/[^0-9\.]/g, '');
            var decimalCheck = clean.split('.');

            if(!angular.isUndefined(decimalCheck[1])) {
                decimalCheck[1] = decimalCheck[1].slice(0,2);
                clean =decimalCheck[0] + '.' + decimalCheck[1];
            }

            if (val !== clean) {
              ngModelCtrl.$setViewValue(clean);
              ngModelCtrl.$render();
            }
            return clean;
          });

          element.bind('keypress', function(event) {
            if(event.keyCode === 32) {
              event.preventDefault();
            }
          });
        }
      };
    });
Run Code Online (Sandbox Code Playgroud)


小智 10

使用step标记将最小可变值设置为某个十进制数:

例如step ="0.01"

<input type="number" step="0.01" min="0" class="form-control" 
name="form_name" id="your_id" placeholder="Please Input a decimal number" required>
Run Code Online (Sandbox Code Playgroud)

这里有一些文档:

http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/


Nis*_*ani 7

演示 - - jsFiddle

指示

   .directive('onlyNum', function() {
      return function(scope, element, attrs) {

         var keyCode = [8,9,37,39,48,49,50,51,52,53,54,55,56,57,96,97,98,99,100,101,102,103,104,105,110];
          element.bind("keydown", function(event) {
            console.log($.inArray(event.which,keyCode));
            if($.inArray(event.which,keyCode) == -1) {
                scope.$apply(function(){
                    scope.$eval(attrs.onlyNum);
                    event.preventDefault();
                });
                event.preventDefault();
            }

        });
     };
  });
Run Code Online (Sandbox Code Playgroud)

HTML

 <input type="number" only-num>
Run Code Online (Sandbox Code Playgroud)

注意:不要忘记包含角度js的jQuery


小智 6

您可以轻松使用ng-pattern.

ng-pattern="/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}(?:\.[0-9]{1,2})?$/"
Run Code Online (Sandbox Code Playgroud)


bin*_*680 5

有一个输入数字指令,我相信可以做你想要的.

<input type="number"
   ng-model="{string}"
   [name="{string}"]
   [min="{string}"]
   [max="{string}"]
   [required]
   [ng-required="{string}"]
   [ng-minlength="{number}"]
   [ng-maxlength="{number}"]
   [ng-pattern="{string}"]
   [ng-change="{string}"]>
Run Code Online (Sandbox Code Playgroud)

官方文件在这里:http://docs.angularjs.org/api/ng.directive : input.number

  • 该问题询问如何防止键入非数字文本.input [type ="number"]不会阻止输入非数字文本,只有在输入非数字文本时才将字段设置为无效. (18认同)