如何在Javascript / Angular JS中进行舍入 - 但删除无关紧要的数字

时间:2015-01-08 22:34:33

标签: javascript html angularjs angularjs-filter

我的Javascript控制器中有以下语句:

$scope.myList = [0, 1, 0.5, 0.6666666];

我的AngularJS模板包括以下内容:

<div ng-repeat="i in myList">{{i}}</div>

这会产生以下HTML输出:

<div>0</div>
<div>1</div>
<div>0.5</div>
<div>0.6666666</div>

但是,我想将数字四舍五入到小数点后两位。 但是,我想在输出中只看到有效数字。我不想看到尾随的零。我该怎么做?使用{{i | number:2}}不会消除尾随零。

3 个答案:

答案 0 :(得分:21)

您可以将其乘以1乘以将其转换为真值。

<div ng-repeat="i in myList">{{(i | number:2)*1}}</div>

从上面的评论中可以看出,由于角度数字过滤器的语言环境格式化,解决方案将会中断。如果您需要区域设置格式和舍入,则可以创建一个扩展过滤器,其下方使用number filter$locale服务。

.filter('numberEx', ['numberFilter', '$locale',
  function(number, $locale) {

    var formats = $locale.NUMBER_FORMATS;
    return function(input, fractionSize) {
      //Get formatted value
      var formattedValue = number(input, fractionSize);

      //get the decimalSepPosition
      var decimalIdx = formattedValue.indexOf(formats.DECIMAL_SEP);

      //If no decimal just return
      if (decimalIdx == -1) return formattedValue;


      var whole = formattedValue.substring(0, decimalIdx);
      var decimal = (Number(formattedValue.substring(decimalIdx)) || "").toString();

      return whole +  decimal.substring(1);
    };
  }
]);

并将其用作:

  <div ng-repeat="i in myList">{{i | numberEx:2}}</div>

<强>演示

&#13;
&#13;
angular.module('app', []).controller('ctrl', function($scope) {

  $scope.myList = [0, 10000.56, 0.5, 0.6666666, -1000.23123, 1, 1002, 2.5, 30.5, 22];

}).filter('numberEx', ['numberFilter', '$locale',
  function(number, $locale) {

    var formats = $locale.NUMBER_FORMATS;
    return function(input, fractionSize) {
      //Get formatted value
      var formattedValue = number(input, fractionSize);

      //get the decimalSepPosition
      var decimalIdx = formattedValue.indexOf(formats.DECIMAL_SEP);
      
      //If no decimal just return
      if (decimalIdx == -1) return formattedValue;

 
      var whole = formattedValue.substring(0, decimalIdx);
      var decimal = (Number(formattedValue.substring(decimalIdx)) || "").toString();
      
      return whole +  decimal.substring(1);
    };
  }
]);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
  <div ng-repeat="i in myList">{{i | numberEx:2}}</div>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:14)

我会这样做:

<div ng-repeat="i in myList">{{formatNumber(i)}}</div>

并在您的控制器中:

$scope.formatNumber = function(i) {
    return Math.round(i * 100)/100; 
}

答案 2 :(得分:1)

由于其他答案并没有真正奏效,或者没有合并或使用Angular的$ locale服务,我写了以下filter

<强>模板:

<span>{{yourNumber | roundTo: N}}</span>

过滤

app.filter('roundTo', function(numberFilter) {
    return function(value, maxDecimals) {
        return numberFilter((value || 0)
            .toFixed(maxDecimals)
            .replace(/(?:\.0+|(\.\d+?)0+)$/, "$1")
        );
    }
})
  • 将数字舍入为最大小数位数

  • 修剪所有尾随零

  • 在不需要时删除小数分隔符

  • 使用Angular的$ locale格式