需要Angular指令,只允许在十进制之前的最大长度为2且在十进制之后的最大长度为2的数字

时间:2017-09-29 13:19:26

标签: angularjs

我需要只允许具有以下限制的数字的Angularjs指令: Exa:输入框仅接受小于99.99的值

输入框不能接受小数点前2个数字,小数点后不能接受2个数字

2 个答案:

答案 0 :(得分:0)

使用ngPattern

您可以使用ngPattern来实现这一目标,因为dd.dd可以达到的最大数量为99.99,因此您可以使用正则表达式对其进行验证。

这个正则表达式将完成工作^\d{1,2}(\.\d{0,2})?$。这样您就可以在输入中使用ngPattern,如下所示:

<input type="text" ng-model="model" name="input" ng-pattern="^\d{1,2}(\.\d{0,2})?$" />

实施ngMax

此外,您可以实现适用于角形式的ngMax directive并接受绑定值,以便您可以从模型中提供它。

app.directive('ngMax', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, elem, attr, ctrl) {
            scope.$watch(attr.ngMax, function () {
                ctrl.$setViewValue(ctrl.$viewValue);
            });
            var maxValidator = function (value) {
                var max = scope.$eval(attr.ngMax) || Infinity;
                if (!isEmpty(value) && value > max) {
                    ctrl.$setValidity('ngMax', false);
                    return undefined;
                } else {
                    ctrl.$setValidity('ngMax', true);
                    return value;
                }
            };

            ctrl.$parsers.push(maxValidator);
            ctrl.$formatters.push(maxValidator);
        }
    };
});
  

参考:jsFiddle implementing ngMax and ngMin by webvitaly

然后你可以像angularjs的常规验证指令一样使用它:

<input type="text" ng-model="model" id="input" name="input" ng-max="99.99" />
  

关于Javascript编号的注意事项,由于javascript舍入坑落,上述指令将因99.99000000000001之类的数字而失败。因此,尽管99.99000000000001大于99.00,但它会在表单上生成valid

答案 1 :(得分:0)

我没有执行这些特定规则的规则,但创建一个规则非常简单。既然你说了指令,我认为你在谈论AngularJS。

这是一个处理用户输入的指令片段。你的工作是创建规则并返回你想要的。您还可以执行警报,模态等,让用户了解错误或使用新值完全替换文本(根据您的规则)。

your_rules_are_not_met 变量将检查您是否需要进行更改。如果不这样做,则返回用户的文本。

如果您确实进行了更改,请确保在下次更改时不会使检查失败(每次更改都会调用该方法两次 - 一次用于初始检查,一次用新值检查)。因此,如果您返回失败的文字,您将 StackOverflow

在此示例中,51到75之间的数字将返回99.25。

angular.module("app", []);
angular.module("app").directive("controlme", function()
{
  return {
    require:"ngModel",
    link: function(scope, elem, attrs, modelCtrl) {
            
      modelCtrl.$parsers.push(function(text){
      
        var myFloat = text * 1;
        console.log(myFloat);
        var your_rules_are_not_met = (myFloat > 50 && myFloat < 76);
        if (your_rules_are_not_met) {
          var newValue = 99.25;
          modelCtrl.$setViewValue(newValue);
          modelCtrl.$render();
          return newValue;
        }
      
        return myFloat;
      });
    }
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>


<body ng-app="app">

<h2>Your Number is :{{my_data}}</h2>

<input type="text" ng-model="my_data" controlme />


</body>