2016-07-13 42 views
1

我正在创建一个指令,我可以选择小数位的长度,并且只接受一个逗号或点,但是我正面临着实现完美正则表达式的问题。限制指令中的小数位

代码

var decimalLenght = 2; 

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

实际上,正则表达式是不是让我插入点或逗号,也允许键入比小数的极限。

+0

你的正则表达式是没有意义的。它删除几乎所有的东西,除了数字和/或点+ 1到2的数字在最后。在示例之前/之后显示一些 – sln

+0

由于不理解代码,当然不删除数字...,我想要删除不是数字,点或逗号的任何东西 –

+0

为什么不使用此指令? https://github.com/nitishkumarsingh13/Angularjs-Directive-Accept-Number-Only – developer033

回答

0

OK,你在正则表达式一个非常小的问题(你必须先“[”后的字符串锚(^)开始),而你不检查逗号......

/^[0-9]+([.,][0-9]{1,2})?$/g 

从那里,因为它需要是动态的,这将是更好的事情可做

new RegExp("^[0-9]+([.,][0-9]{1," + decimalLength + "})?$", "g"); 

这些变化,并改变检查逻辑,你应该得到类似

var decimalLenght = 2; 

ngModelCtrl.$parsers.push(function(val) { 
    if (angular.isUndefined(val)) { 
     val = ''; 
    } 

    var check = new RegExp("^[0-9]+([.,][0-9]{1," + decimalLength + "})?$","g"); 
    if (check.test(val)) { 
     return val; 
    } else { 
     ngModelCtrl.$setViewValue(''); 
     ngModelCtrl.$render(); 
     return ''; 
    } 
}); 

这是我用来检查我的正则表达式http://www.regexr.com/的奇妙工具。它有一个非常直观的界面,似乎处理溢出特别好。

+0

问题是,会考虑代码示例的其余部分:var clean = val.replace(/[^0-9]+([.[0-9]{1,2})?$/g,'' );我有这个能够清理无效的所有东西,这样用户只能插入有效值 –

+0

@MarcoPereira我所做的改变应该使它适用于你需要的工作 –

+0

它不工作,当我继续输入输入当插入点时,它被清除。 –

0

您可以使用此directive并根据您的要求设置输入。

这里有一个片段进行论证:

angular.module('app', []) 
 
    .controller('mainCtrl', function($scope) { 
 
    $scope.options = []; 
 
    for (var i = 1; i <= 10; i++) { 
 
     $scope.options.push(i); 
 
    } 
 
    }) 
 
    .directive('nksOnlyNumber', function() { 
 
    return { 
 
     restrict: 'EA', 
 
     require: 'ngModel', 
 
     link: function(scope, element, attrs, ngModel) { 
 
     scope.$watch(attrs.ngModel, function(newValue, oldValue) { 
 
      if (newValue) { 
 
      var spiltArray = String(newValue).split(""); 
 

 
      if (attrs.allowNegative == "false") { 
 
       if (spiltArray[0] == '-') { 
 
       newValue = newValue.replace("-", ""); 
 
       ngModel.$setViewValue(newValue); 
 
       ngModel.$render(); 
 
       } 
 
      } 
 

 
      if (attrs.allowDecimal == "false") { 
 
       newValue = parseInt(newValue); 
 
       ngModel.$setViewValue(newValue); 
 
       ngModel.$render(); 
 
      } 
 

 
      if (attrs.allowDecimal != "false") { 
 
       if (attrs.decimalUpto) { 
 
       var n = String(newValue).split("."); 
 
       if (n[1]) { 
 
        var n2 = n[1].slice(0, attrs.decimalUpto); 
 
        newValue = [n[0], n2].join("."); 
 
        ngModel.$setViewValue(newValue); 
 
        ngModel.$render(); 
 
       } 
 
       } 
 
      } 
 

 
      if (spiltArray.length === 0) return; 
 
      if (spiltArray.length === 1 && (spiltArray[0] == '-' || spiltArray[0] === '.')) return; 
 
      if (spiltArray.length === 2 && newValue === '-.') return; 
 

 
      /*Check it is number or not.*/ 
 
      if (isNaN(newValue)) { 
 
       ngModel.$setViewValue(oldValue || ''); 
 
       ngModel.$render(); 
 
      } 
 
      } 
 
     }); 
 
     } 
 
    }; 
 
    });
<!DOCTYPE html> 
 
<html ng-app="app"> 
 

 
<head> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script> 
 
</head> 
 

 
<body ng-controller="mainCtrl"> 
 
    <form name="form"> 
 
    <label for="option">Decimal place: </label> 
 
    <select id="option" ng-options="option for option in options" ng-model="option"> 
 
     <option value="">Select the length</option> 
 
    </select> 
 
    <hr> 
 
    <label for="input">Input with decimals: </label> 
 
    <input type="text" id="input" nks-only-number ng-model="input" decimal-upto="{{option}}" required> 
 
    <br> 
 
    <label for="input2">Input without decimals: </label> 
 
    <input type="text" id="input2" nks-only-number ng-model="input2" allow-decimal="false"> 
 
    </form> 
 
</body> 
 

 
</html>

+0

但是给了我一个错误在attrs。allowDecimal ==“false”,当我使用例如,它给我一个错误$ rootScope:infdig无限$ digest循环 –

+0

我现在看到了,但你说你想限制小数位,对吧?为什么你需要去掉小数? – developer033

+0

,因为是来自项目经理和客户的要求:S,他们不希望用户能够插入任何点/逗号,小数,以减少错误 –