【问题标题】:Restrict number of decimals in html5 type="number" input field (with Angularjs model)限制 html5 type="number" 输入字段中的小数位数(使用 Angularjs 模型)
【发布时间】:2013-04-14 14:30:02
【问题描述】:

请找到小提琴 http://jsfiddle.net/q2SgJ/5/

<div ng-app="">
  <div ng-controller="Ctrl">

      WANTS:  {{val | number:2}} in "input" elelent<br>
    2 decimal in input:  <input  ng-model='val'> <br>
    2 decimal in input:  <input  type="number" step="0.01" ng-model='val'><br>
    2 decimal in input:  <input  ng-model='val' value="{{val |number:2}}"> <br>

  </div>
</div>

如何将输入字段中的小数位限制为 2 位。如示例中的{{val | number:2}} 有效,但不确定如何使用它来格式化附加到字段的ng-model。我本可以格式化数据/模型本身,但我想保留额外的小数点的值很少,但只显示 2 个小数点。

谢谢。

【问题讨论】:

    标签: javascript html angularjs


    【解决方案1】:

    我已经扩展了蒂姆的小提琴,以防有人正在寻找可行的解决方案

    http://jsfiddle.net/q2SgJ/653/

    修改了按键事件以根据光标位置检索原始键入的值

    ele.bind('keypress',function(e){
            var value = $(this).val();
                        var decimalPointPosition = value.indexOf(".");
                        if(!((e.charCode === 46) || (e.charCode > 47 && e.charCode <= 57)))
                            e.preventDefault();
    
                        else if (decimalPointPosition >= 0) {
                            var decimalCount = value.substring(decimalPointPosition + 1).length;
                            if ((decimalCount == 2 && $(this).prop("selectionStart") > decimalPointPosition)) {
                                e.preventDefault();                     
                }
               }       
    
            }
    

    【讨论】:

      【解决方案2】:

      您可以在没有 JQuery 和指令的情况下执行此操作。您最初的 step 尝试非常接近。我发现 this site 展示了如何使用 HTML5 输入来限制使用 step 和 AngularJS 正则表达式输入过滤器。

      <div ng-app="app">
          <div ng-controller="Ctrl"> @*Just an empty controller in this example*@
              <form name="myForm">
                  <input type="number" name="myDecimal" placeholder="Decimal" ng-model="myDecimal" ng-pattern="/^[0-9]+(\.[0-9]{1,2})?$/" step="0.01" /><br />
                  Is a valid decimal?<span ng-show="!myForm.myDecimal.$valid">{{myForm.myDecimal.$valid}}</span>
              </form>
          </div>
      </div>
      

      【讨论】:

        【解决方案3】:

        在确定要限制多少小数位时,我扩展了已接受的答案以查看 step 属性。

        directive('forcePrecision', function () {
            return {
                restrict: 'A',
                scope: {
                   step: '@'
                },
                link: function (scope, element, attrs) {
                    if (!scope.step || scope.step == 'any') {
                       return;
                    }
        
                    var prec = 1;
                    for (var i = scope.step; i != 1; i *= 10) {
                        prec *= 10;
                    }
        
                    element.on('keypress', function (e) {
                        var val = Number(element.val() + (e.charCode !== 0  ? String.fromCharCode(e.charCode) : ''));
        
                        if (val) {
                            var newVal = Math.floor(val * prec) / prec;
        
                            if (val != newVal) {
                                e.preventDefault();
                            }
                        }
                    });
                }
            };
        });
        

        【讨论】:

          【解决方案4】:

          您可以编写指令来控制此功能。它不是 angular 附带的东西,但指令可以控制页面上的外观和工作方式。

          我写了一个简单的:http://jsfiddle.net/q2SgJ/8/

          这是解决问题的链接函数:

             link:function(scope,ele,attrs){
                  ele.bind('keypress',function(e){
                      var newVal=$(this).val()+(e.charCode!==0?String.fromCharCode(e.charCode):'');
                      if($(this).val().search(/(.*)\.[0-9][0-9]/)===0 && newVal.length>$(this).val().length){
                          e.preventDefault();
                      }
                  });
              }
          

          这适用于将输入限制为 2 位小数,但不会将输入格式化为 2 位小数。无论如何,这是一个起点。我相信您可以查找其他示例并编写自己的指令来按照您想要的方式处理它。 Angular 的特点在于,它不是一个对所有问题都有答案的框架,而是一个允许您创建比 HTML5 单独提供的功能更多的功能并使其非常简单的框架。

          【讨论】:

          • Tim,感谢您确认它在 html5 中是不可能的,也是 Angular 中必需的方法。
          • 一旦达到 2dp,此指令将阻止您输入任何值,即。您将无法更改小数点左侧的数字
          • ^ 同意。它假定用户只输入一个数字(用户输入总是在最右边),因此不处理在任何其他位置编辑的数字。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-21
          相关资源
          最近更新 更多