Подтвердить что ты не робот

Как объединить Javascript/Angular JS - но удалить незначительные цифры

У меня есть следующий оператор в моем контроллере Javascript:

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

В моем шаблоне My 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}} не отменяет конечные нули.

4b9b3361

Ответ 1

Вы могли бы просто несколько на 1 преобразовать его в истинное значение.

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

Как отмечено в комментариях выше, решение будет нарушено из-за форматирования локалей с помощью фильтра числа angular. Если вам нужно форматирование и округление локали, вы можете создать фильтр расширения, который под ним использует службы 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>

Demo

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);
    };
  }
]);
<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>

Ответ 2

Я бы сделал это следующим образом:

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

и в вашем контроллере:

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

Ответ 3

Поскольку другие ответы не очень хорошо работали или не включались или работали с сервисом 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 $форматирование локали