我正在构建一个涉及大量数据的 Angular 应用程序。我想缩短它们的显示方式,因此我构建了一个快速而肮脏的过滤器,例如将“1000000000”替换为“$10亿”,但它确实很脏,它只是 chop 数字而不是将它们四舍五入。
这里是:
.filter('largeAmountCurrency', function() {
return function(input) {
if (!input) return;
var oneBillion = 1000000000,
oneMillion = 1000000;
if (input > oneBillion)
return '$' + parseInt(input / oneBillion) + '.' +
String(parseInt(input - parseInt(input/oneBillion))).substring(1,3) + 'Bn';
if (input > oneMillion)
return '$' + parseInt(input / oneMillion) + '.' +
String(parseInt(input - parseInt(input/oneMillion))).substring(1,3) + 'M';
return input;
}
});
他们是否有任何预先构建的 Angular 过滤器可以完成这项工作?或者我怎样才能大幅缩短它?
最佳答案
您可以使用数学对数 log ! 计算一些东西。这将帮助您了解输入的位数。
示例(log 是以 10 为底的对数,ln 是 napierian 对数):
log(12345678910) = ln(12345678910)/ln(10) = 10
这里,10 是第一个“1”之后的位数。
根据这些信息,您可以计算一个简化值,然后用 toFixed 对其进行舍入! (这适用于 IE5.5+、Javascript 1.5,我假设您在使用 AngularJS 时会得到它)
下面是完整的示例:
var number = 12345678910;
var digits = 2;
var suffix = ["", "K.", "M.", "B."];
var nbDigits = Math.round(Math.log(number)/Math.LN10);
var power = nbDigits - nbDigits%3;
var tmp = number/ Math.pow(10, power);
var suffixIndex = Math.min(3, power/3);
var result = "$" + tmp.toFixed(digits) + " " + suffix[suffixIndex];
关于javascript - 大额货币过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666485/