Search code examples
angularjsangularjs-filter

Number filter filters number down to two decimals, but does not display it that way


This is what I see:

The value is set at 160.90, but displays as 160.8999999999 etc.

<input class="form-control" ng-model="imprint.total" 
    value="{{imprint.total | number:2}}" readonly>

It goes through filtering of certain inputs to get that total, but essentially it's just a price multiplied to quantity.


Solution

  • The value in the value attribute will be overridden by ng-model directive when it sets the viewvalue as it renders. You have a readonly textbox you could just as well remove the ng-model from it.

    <input class="form-control" 
           value="{{imprint.total | number:2}}" readonly>
    

    With ng-model and to format live data entry you would need to create a directive and use parsers/formatters to format the value.

    angular.module('app', []).directive('format', ['numberFilter',
      function(numberFilter) {
        return {
          restrict: 'A',
          require: 'ngModel',
          link: function(scope, elm, attr, ngModel) {
            var decPlaces = attr.format || 2;
    
            function formatter(value) {
    
              if (value) {
                return numberFilter(value, decPlaces);
              }
            }
    
            ngModel.$formatters.push(formatter);
    
          }
        }
      }
    ]);
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="app" ng-init="imprint=164.899999">
      <input class="form-control" value="{{imprint | number:2}}" readonly>
    
      <input class="form-control" ng-model="imprint" format="2" readonly>
    
    </div>