javascript - 大额货币过滤器

标签 javascript angularjs filter

我正在构建一个涉及大量数据的 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/

相关文章:

javascript - Codeigniter 根据所选日期从数据库中填充下拉值

javascript - 邀请 friend 将他们带到空白页面

javascript - 使用 AngularJS 访问 .animation 中的 $scope

angularjs - 在 angularjs 中使用 json pretty-print

javascript - 在多个值的对象数组中搜索

javascript:如何通过单击按钮退出循环

javascript - 在routeprovider中使用resolve时AngularJS加载图标

c# - 解析自定义过滤器语法的最佳方法

c# - 如何在 Visual Studio 2010 中调试过滤器程序?

javascript - 有没有办法改变移动键盘上的转到/提交按钮在移动网页上的作用?