AngularJS货币/数字输出没有舍入

时间:2016-05-31 21:03:59

标签: javascript angularjs

我正在尝试进行货币/数字输入/输出而不进行舍入。

我遇到的使用货币的问题是双重的,(1)一旦输入第三个数字,它会将第二个小数舍入,(2)它甚至允许输入第三个数字。如果您注意到我的del()函数,它会删除数字的结尾,但显示可能是:$ 27.46。该字符串实际上可能是27.45606020,并且退格将删除用户甚至看不到的数字。

目前我有一些hacky代码,甚至没有使用AngularJS货币或数字,并使用过滤器来防止两位小数后的数字,以及添加小数时,我有它所以它只能是添加一次。

{{checkTotal | dropDigits}

.filter('dropDigits', function() {
    return function(floatNum) {
        return String(floatNum)
            .split('.')
            .map(function (d, i) { return i ? d.substr(0, 2) : d; })
            .join('.');
    };
})

.controller('tipController', function($scope) {

  // Numpad
  $scope.checkTotal = '0.00';

  $scope.clicked = function (label) {
    if($scope.checkTotal === '0.00') {
      $scope.checkTotal = label;
    } else {
      $scope.checkTotal += label;
    }
   };

   // Prevent multiple decimals
   $scope.clickedDot = function() {
      if (($scope.checkTotal.indexOf('.') < 0) || ($scope.checkTotal === '0.00')) {
        if (($scope.checkTotal === '0.00') || ($scope.checkTotal === '')) {
          $scope.checkTotal = '0.';
        } else {
          $scope.checkTotal += '.';
        }
      }
  };

   $scope.del = function () {
      $scope.checkTotal = $scope.checkTotal.slice(0, -1);
   };

});

2 个答案:

答案 0 :(得分:1)

你可以使用Math.floor来缩小小数位数而不用舍入。只需将floor内的值乘以100,然后在内部进行所需的数学计算,然后除以100即可得到正确的结果大小。

请查看下面的演示或此fiddle

angular.module('demoApp', [])
	.controller('mainController', MainController);
    
function MainController($timeout) {
	var vm = this;
    
    angular.extend(vm, {
    	input: 10.25,
        total: 0,
        calcTip: function() {
        	// 10% tip // 2 decimal places no rounding.
            // floor calc. from this SO answer
            // http://stackoverflow.com/questions/4187146/display-two-decimal-places-no-rounding
            vm.total = Math.floor(vm.input * 1.1 * 100) / 100;
        }
    });
    
    vm.calcTip(); // initial calc.
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="demoApp" ng-controller="mainController as mainCtrl">
    <input ng-model="mainCtrl.input" ng-change="mainCtrl.calcTip()"/>
    <br/>
    <strong>{{mainCtrl.total | currency}}</strong>
</div>

答案 1 :(得分:0)

我能够用另一个if语句修复我的问题

$scope.clicked = function(label) {
  if ($scope.checkTotal === '0.00') {
    $scope.checkTotal = label;
  } else {
    if (($scope.checkTotal.indexOf('.') != -1) && ($scope.checkTotal.substring($scope.checkTotal.indexOf('.')).length > 2)) { //if there is a decimal point, and there are more than two digits after the decimal point
      label.preventDefault();
    } else {
      $scope.checkTotal += label;
    }
  }
};