删除AngularJS货币过滤器十进制/美分

Mik*_*ras 64 formatting filter angularjs angularjs-filter

有没有办法从货币过滤器的输出中删除小数/美分?我正在做这样的事情:

<div>{{Price | currency}}</div>
Run Code Online (Sandbox Code Playgroud)

哪个输出:

$ 1,000.00

相反,我想:

$ 1,000个

可以使用货币过滤器完成吗?我知道我可以在数字上加一个美元符号,我可以编写自己的过滤器,但我希望现有的货币过滤器存在一个简单的方法.

谢谢.

Liv*_* T. 115

更新:从版本1.3.0开始 - currencyFilter:将fractionSize添加为可选参数,请参阅commit 和updated plunker

{{10 | currency:undefined:0}}
Run Code Online (Sandbox Code Playgroud)

请注意,它是第二个参数,因此您需要传入undefined以使用当前的区域设置货币符号

更新:请注意,这仅适用于数字前显示的货币符号.从版本1.2.9开始,它仍然硬编码为2位小数.

是一个修改后的版本,它使用angular的formatNumber副本来启用0 fractionSize作为货币.


通常,这应该可以在locale定义或currencyFilter调用中进行配置,但是现在(1.0.4)它可以硬编码到2个小数位.

自订过滤器:

myModule.filter('noFractionCurrency',
  [ '$filter', '$locale',
  function(filter, locale) {
    var currencyFilter = filter('currency');
    var formats = locale.NUMBER_FORMATS;
    return function(amount, currencySymbol) {
      var value = currencyFilter(amount, currencySymbol);
      var sep = value.indexOf(formats.DECIMAL_SEP);
      if(amount >= 0) { 
        return value.substring(0, sep);
      }
      return value.substring(0, sep) + ')';
    };
  } ]);
Run Code Online (Sandbox Code Playgroud)

模板:

<div>{{Price | noFractionCurrency}}</div>
Run Code Online (Sandbox Code Playgroud)

例:

更新:修复处理负值时的错误


Tom*_*Tom 32

这个问题似乎相当陈旧,给出的答案很好.但是,还有另一种替代解决方案也可以提供帮助(我在我的项目中使用).

这与货币符号前缀以及正值和负值的后缀相符合.

自订过滤器:

angular.module('your-module', [])
    .filter('nfcurrency', [ '$filter', '$locale', function ($filter, $locale) {
        var currency = $filter('currency'), formats = $locale.NUMBER_FORMATS;
        return function (amount, symbol) {
            var value = currency(amount, symbol);
            return value.replace(new RegExp('\\' + formats.DECIMAL_SEP + '\\d{2}'), '')
        }
    }])
Run Code Online (Sandbox Code Playgroud)

模板:

<div>{{yourPrice| nfcurrency}}</div>
Run Code Online (Sandbox Code Playgroud)

不同语言环境的示例:

  • 10.00(zh-gb) - > 10英镑
  • 20.00(en-us) - > 20美元
  • -10.00(zh-CN) - > ($ 10)
  • 30.00(da-dk) - > 30 kr
  • -30.00(da-dk) - > -30 kr

请看一下美元丹麦克朗的现场演示.

更新

请注意,此解决方法适用于AngularJS 1.2及更早版本的库.从AngularJS 1.3开始,您可以使用货币格式化程序,第三个参数指定分数大小 - "将金额四舍五入的小数位数".

请注意,为了使用来自AngularJS本地化的默认货币格式,您必须使用设置为的货币符号(第二个参数)undefined(null或为不起作用).美元丹麦克朗的演示示例.

  • 非常感谢,我更喜欢这个,因为它使用原始的`$ filter`并且仅"修复"尾随小数. (2认同)

小智 31

另一件值得考虑的事情是,如果你知道你只有一种语言环境或一种货币,你可以将货币符号放在数字之前,然后像这样使用数字过滤器(对于美国货币).

  ${{Price | number:0}}
Run Code Online (Sandbox Code Playgroud)

如果您不想使用新过滤器并且只有一种货币,那么可以使用更多快速解决方案.

  • 这种方法的一个缺点是负数打印为$ -100而不是$(100) (2认同)

Ali*_*avi 18

现在已经晚了但可能会帮助一些人

{{value | currency : 'Your Symbol' : decimal points}}
Run Code Online (Sandbox Code Playgroud)

那么让我们看看输出的一些例子

{{10000 | currency : "" : 0}}           // 10,000
{{10000 | currency : '$' : 0}}          // $10,000 
{{10000 | currency : '$' : 2}}          // $10,000.00 
{{10000 | currency : 'Rs.' : 2}}        // Rs.10,000.00
{{10000 | currency : 'USD $' : 2}}      // USD $10,000.00
{{10000 | currency : '#' : 3}}          // #10,000.000
{{10000 | currency : 'ANYTHING: ' : 5}} // ANYTHING: 10,000.00000
Run Code Online (Sandbox Code Playgroud)

演示


Dus*_*tin 5

这是另一个类似的解决方案,但它删除.00十进制,但留下任何其他小数.

10.00美元到10美元

10.20美元至10.20美元

app.filter('noFractionCurrency', [ '$filter', '$locale', function(filter, locale) {
    var currencyFilter = filter('currency');
    var formats = locale.NUMBER_FORMATS;
    return function(amount, currencySymbol) {
        amount = amount ? (amount*1).toFixed(2) : 0.00;
        var value = currencyFilter(amount, currencySymbol);
        // split into parts
        var parts = value.split(formats.DECIMAL_SEP);
        var dollar = parts[0];
        var cents = parts[1] || '00';
            cents = cents.substring(0,2)=='00' ? cents.substring(2) : '.'+cents; // remove "00" cent amount
        return dollar + cents;
    };
}]);
Run Code Online (Sandbox Code Playgroud)