<md-autocomplete> with custom item formatting

HTML

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular-animate.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular-aria.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular-messages.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-material/1.1.4/angular-material.min.js"></script>
<div ng-app="Bootstrap" ng-controller="AutocompleteController">
  <div layout-gt-sm="row">
    <md-autocomplete md-search-text="model.taxBox" md-selected-item="model.taxBoxItem" md-items="item in filterItemsByValue(model.taxBox)" md-item-text="item.value.toString()" md-floating-label="Tax in %" md-min-length="0" md-clear-button="true" required
    ng-pattern="/^[1-9]/">
    
      <md-item-template>
        <span md-highlight-text="ctrl.searchText">{{item.value}}% ({{item.label}})</span>
      </md-item-template>
    </md-autocomplete>
    <md-input-container>
      <label>Income</label>
      <input ng-model="model.income" integer ng-pattern="/^[1-9]\d+$/"/>
    </md-input-container>
  </div>
  <div>
    <hr>
    Current tax value is {{model.taxBox}} and item is: {{model.taxBoxItem}}.<br>
    Income type is: {{getIncomeType()}}.
  </div>
</div>

CSS

md-input-container {
  margin-top: 2em !important;
  margin-left: 1em;
}

JavaScript

var bootstrapModule = angular.module('Bootstrap', ['ngMaterial']);

function safeParseInt(value) {
  var result;
  if (!value || value === '' || isNaN(result = parseInt(value, 10)) || result != value) {
    return 0;
  }
  return result;
}

// Directive to solve the problem with numeric model item check:
// http://stackoverflow.com/questions/19404969/angular-data-binding-input-type-number
// http://stackoverflow.com/questions/15072152/input-model-changes-from-integer-to-string-when-changed
bootstrapModule.directive('integer', function() {
  return {
    require: 'ngModel',
    link: function(scope, ele, attr, ctrl) {
      ctrl.$parsers.push(safeParseInt);
    }
  };
});

bootstrapModule.controller('AutocompleteController', ['$scope', function($scope) {
  $scope.config = {
    taxBoxes: [{
      value: 12,
      label: 'box 1'
    }, {
      value: 40,
      label: 'box 2 & 3'
    }, {
      value: 52,
      label: 'box 4'
    }, ],
  };

  $scope.model = {
    taxBox: '6',
    income: 1200
  };

  $scope.filterItemsByValue = function(value) {
    if (value == '') {
      return $scope.config.taxBoxes;
    }

    return $scope.config.taxBoxes.filter(function(item) {
      return item.value.toString().startsWith(value);
    });
  };
  
  $scope.getIncomeType = function() {
    return typeof($scope.model.income);
  };

}]);