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

时间:2013-02-08 22:33:09

标签: angularjs filter formatting angularjs-filter

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

<div>{{Price | currency}}</div>

哪个输出:

  

$ 1,000.00

相反,我想:

  

$ 1,000

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

谢谢。

13 个答案:

答案 0 :(得分:114)

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

{{10 | currency:undefined:0}}

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

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

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


通常情况下,这应该可以在语言环境定义或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) + ')';
    };
  } ]);

<强>模板:

<div>{{Price | noFractionCurrency}}</div>

示例:

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

答案 1 :(得分: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}'), '')
        }
    }])

<强>模板:

<div>{{yourPrice| nfcurrency}}</div>

不同语言环境的示例:

  • 10.00(en-gb) - &gt;的£10
  • 20.00(zh-CN) - &gt; <强>港币$ 160
  • -10.00(zh-cn) - &gt;的(10 $)
  • 30.00(da-dk) - &gt; 30 kr
  • -30.00(da-dk) - &gt; -30 kr

请查看US dollarsDanish Krone的实时演示。

<强>更新

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

请注意,要使用来自AngularJS本地化的默认货币格式,您必须使用设置为undefined的货币符号(第二个参数)(null为空不管用)。 US dollarsDanish Krone的演示示例。

答案 2 :(得分:30)

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

  ${{Price | number:0}}

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

答案 3 :(得分:17)

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

{{value | currency : 'Your Symbol' : decimal points}}

让我们看看输出

的一些例子
{{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

请参阅demo

答案 4 :(得分: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;
    };
}]);

答案 5 :(得分:3)

另一个解决方案,这个删除尾随零并找到最常见货币的正确货币符号:

{{10.00 | money:USD}}至$ 10

{{10.00 | money:EUR}}到€10

/**
 * @ngdoc filter
 * @name money
 * @kind function
 *
 * @description
 * Formats a number as a currency (ie $1,234.56), removing trailing zeros and using the     real currency symbol when possible. When no currency symbol is provided, default
 * symbol for current locale is used.
 *
 * @param {number} amount Input to filter.
 * @param {string=} symbol Currency symbol or identifier to be displayed.
 * @returns {string} Formatted number. *
 */
app.filter('money', [ '$filter', '$locale', function (filter, locale) {
var currencyFilter = filter('currency');
var formats = locale.NUMBER_FORMATS;

var getCurrencySymbol = function (code) {
    switch (code.toUpperCase()) {
        case 'EUR': //Euro
            return '€';

        case 'USD': //Dólar americano
        case 'MXN': //Peso mejicano
        case 'CAD': //Dólar de Canadá
        case 'AUD': //Dólar australiano
        case 'NZD': //Dólar neozelandés
        case 'HKD': //Dólar de Hong Kong
        case 'SGD': //Dólar de Singapur
        case 'ARS': //Peso argentino
            return '$';

        case 'CNY': //Yuan chino
        case 'JPY': //Yen japonés
            return '¥';

        case 'GBP': //Libra esterlina
        case 'GIP': //Libras de Gibraltar
            return '£';

        case 'BRL': //Real brasileño
            return 'R$';

        case 'INR': //Rupia india
            return 'Rp';

        case 'CHF': //Franco suizo
            return 'Fr';

        case 'SEK': //Corona sueca
        case 'NOK': //Corona noruega
            return 'kr';

        case 'KPW': //Won de Corea del Norte
        case 'KRW': //Won de Corea del Sur
            return '₩';

        default:
            return code;
    }
};

return function (amount, currency) {
    var value;
    if (currency) {
        value = currencyFilter(amount, getCurrencySymbol(currency));
    }
    else {
        value = currencyFilter(amount);
    }

    //Remove trailing zeros
    var regex = new RegExp("\\" + formats.DECIMAL_SEP + "0+", "i");
    return value.replace(regex, '');
};
} ]);

答案 6 :(得分:3)

角度版本的解决方案&lt; 1.3, 如果您使用i18n,最简单的方法是:

$filter('number')(x,0) + ' ' +$locale.NUMBER_FORMATS.CURRENCY_SYM;

通过这种方式,您可以根据区域设置使用正确的分隔符和货币符号格式化数字。

答案 7 :(得分:3)

对于AngularJS 1.2 您只需合并numbercurrency过滤器

即可
app.filter('noFractionCurrency', ['numberFilter', 'currencyFilter', function(numberFilter, currencyFilter) {
        return function(input, symbol) {
            var amount = numberFilter(input);
            return symbol + amount;
        };
    }]);

答案 8 :(得分:2)

如果您要汇总到最近的$ 1000:Live Demo

var app = angular.module('angularjs-starter', []);

app.filter('noFractionRoundUpCurrency',
    [ '$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) { 
                    if (amount % 1000 < 500){
                        return '$' + (amount - (amount % 500));
                    } else {
                        return '$' + (amount - (amount % 500) + 500);          
                    }

        }
        else{
                    if (-amount % 1000 < 500){
                        return '($' + (-amount - (-amount % 500)) + ')';
                    } else {
                        return '($' + (-amount - (-amount % 500) + 500)+ ')';          
                    }
        }
      };
    } ]);

app.controller('MainCtrl', function($scope) {

});

答案 9 :(得分:2)

正是我需要的!

我添加了一个条件来完全替换Angular的货币过滤器,并且只使用@Tom上面看到的过滤器的修改版本。我确信有更好的方法可以做到这一点,但到目前为止它似乎对我有用。


'use strict';
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), valArr = value.split(formats.DECIMAL_SEP);
      if(parseInt(valArr[(valArr.length - 1)]) > 0) {
        return value;
      } else {
        return value.replace(new RegExp('\' + formats.DECIMAL_SEP + '\d{2}'), '');
      }
    };
  }]);

答案 10 :(得分:2)

我已经修改了@Liviu T.发布的过滤器,以接受带有符号的货币后的数字和一定的小数位数:

app.filter('noFractionCurrency',
[ '$filter', '$locale', function(filter, locale) {
  var currencyFilter = filter('currency');
  var formats = locale.NUMBER_FORMATS;
  return function(amount, num, currencySymbol) {
    if (num===0) num = -1;
    var value = currencyFilter(amount, currencySymbol);
    var sep = value.indexOf(formats.DECIMAL_SEP)+1;
    var symbol = '';
    if (sep<value.indexOf(formats.CURRENCY_SYM)) symbol = ' '+formats.CURRENCY_SYM;
    return value.substring(0, sep+num)+symbol;
  };
} ]);

例如:

{{10.234 | noFractionCurrency:0}}
{{10.55555 | noFractionCurrency:2}}

输出:

$10
$10.56

Demo

答案 11 :(得分:2)

如果您使用angular-i18nbower install angular-i18n),则可以使用装饰器更改区域设置文件中的默认值,如下所示:

$provide.decorator('$locale', ['$delegate',
  function ($delegate) {
    $delegate.NUMBER_FORMATS.PATTERNS[1].maxFrac = 0;
    $delegate.NUMBER_FORMATS.PATTERNS[1].minFrac = 0;
    return $delegate;
}]);

请注意,这适用于代码中的所有货币过滤器使用。

答案 12 :(得分:0)

在Angular 4+中

{{totalCost | currency : 'USD' : 'symbol' : '1.0-0' }}