货币过滤器大量的角度

时间:2014-09-04 13:13:22

标签: javascript angularjs filter

我正在构建一个涉及大量的角度应用程序。我想缩短它们的显示方式,所以我建立了一个快速而肮脏的过滤器,取代了#100; 1000000000'通过&#; $ 1.0Bn'例如,但它真的很脏,它只是截断数字而不是将它们四舍五入。

这是:

  .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;
    }
  });

他们的任何预制过滤器是否有角度来完成这项工作?或者我怎样才能大大缩短它?

1 个答案:

答案 0 :(得分:2)

您可以使用数学对数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];