【问题标题】:currency filter for large amount in angular [closed]角度大金额的货币过滤器[关闭]
【发布时间】:2014-09-04 13:13:21
【问题描述】:

我正在构建一个涉及大量数据的 Angular 应用程序。我想缩短它们的显示方式,所以我构建了一个快速而肮脏的过滤器,例如将 '1000000000' 替换为 '$10 亿',但它真的很脏,它只是截断数字而不是四舍五入。

这里是:

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

他们是否有任何预先构建的角度过滤器可以完成这项工作?或者我怎样才能显着缩短它?

【问题讨论】:

    标签: javascript angularjs filter


    【解决方案1】:

    您可以使用数学对数 log! 计算一些东西。这将帮助您了解输入的位数。

    示例(log 是以 10 为底的对数,ln 是纳皮尔对数):

    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];
    

    【讨论】:

    • 如果是1000,我希望数字显示为1k。请告诉我逻辑
    • 请注意,我将parseInt 更改为Math.round,现在您得到了:$ 1.00 K. 您可以通过将digits 更改为0 和suffix 更改为["", "k", "m", "b"] 来获得预期的行为
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2015-11-22
    • 2015-08-28
    相关资源
    最近更新 更多