angularjs:只允许将数字输入文本框

Ali*_*san 67 javascript ruby-on-rails numeric angularjs

在angularjs有任何可用的功能,只允许数字被输入到一个文本框

Ant*_*ton 64

此代码显示了如何防止输入非数字符号的示例.

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;
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

  • 正如Blowsie所说,这段代码在所有情况下都不起作用..这里有一个工作的jsfiddle,我正在尝试更新这个答案使用:http://jsfiddle.net/thomporter/DwKZh/ (7认同)
  • 这段代码有效,但确实需要评论 (2认同)

小智 42

HTML

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

//输入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);
      }
    };
});
Run Code Online (Sandbox Code Playgroud)

//键入:123或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);
      }
    };
 });
Run Code Online (Sandbox Code Playgroud)

  • 您的第二个示例(//类型:123或123.45)允许输入多个小数位,例如11.22..33 ..... 444将返回有效. (2认同)
  • 我想我们可以使用以下if来处理它(digits.split('.').length> 2)digits = digits.substring(0,digits.length - 1); (2认同)

sam*_*nau 37

我只是在指令中使用ng-keypress来输入.

HTML:

<input type="text" ng-keypress="filterValue($event)"/>
Run Code Online (Sandbox Code Playgroud)

JS:

$scope.filterValue = function($event){
        if(isNaN(String.fromCharCode($event.keyCode))){
            $event.preventDefault();
        }
};
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很简单,虽然非角度方式可能会阻止一些,我绝对喜欢这种方法.不得不添加其他2个必须允许的情况,event.which === 8和event.which === 46(分别用于退格和删除) (4认同)
  • 虽然这不是真正的"角度方式",但似乎是防止用户输入的相对安全的选择 (2认同)

ana*_*mok 25

这个功能正是您所需要的.http://docs.angularjs.org/api/ng.directive:input.number

编辑:

您可以将jquery插件包装到指令中.我在这里创建了一个例子: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>
Run Code Online (Sandbox Code Playgroud)

CSS:

.ng-invalid {
    border: 1px solid red;
}
Run Code Online (Sandbox Code Playgroud)

JS:

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

app.directive('numberMask', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            $(element).numeric();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 不是OP要求的.您的解决方案提供输入验证(即,在检测到非数字时显示错误),但用户仍可在文本框中键入非数字. (15认同)

Sij*_*ung 18

这是最简单,最快速的方法,仅允许数字输入.

<input type="text" id="cardno" placeholder="Enter a Number" onkeypress='return event.charCode >= 48 && event.charCode <= 57' required>
Run Code Online (Sandbox Code Playgroud)

谢谢

  • 问题是只允许数字输入,如果你想要更多,那么当然它可以相应地定制.所以这只是一个建议,而不是对所有问题的具体答案. (2认同)

Cra*_*aig 7

以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;
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)


Car*_*edo 7

我的解决方案接受复制和粘贴并保存插入符号的位置.它用于产品成本,因此仅允许正十进制值.可以很容易地重构,允许负数或只是整数位.

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;
                        }
                    });
                }
            };
        });
Run Code Online (Sandbox Code Playgroud)

放在html页面上:

<input type="text" class="form-control" only-number ng-model="vm.cost" />
Run Code Online (Sandbox Code Playgroud)