我正在尝试进行货币/数字输入/输出而不进行舍入。
我遇到的使用货币的问题是双重的,(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);
};
});
答案 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;
}
}
};