为什么AngularJS货币过滤器用括号格式化负数?

Mis*_*hko 30 angularjs angularjs-filter

现场演示

为什么这个:

# Controller
$scope.price = -10;

# View
{{ price | currency }}
Run Code Online (Sandbox Code Playgroud)

结果($10.00)而不是-$10.00

小智 77

我知道这是一个古老的问题,但接受的答案只是回答为什么会发生这种情况,而没有具体解决问题.我认为这样做的"最正确的方法"是使用像这样的装饰器:

angular
    .module('app')
    .config(['$provide', function($provide) {
        $provide.decorator('$locale', ['$delegate', function($delegate) {
          if($delegate.id == 'en-us') {
            $delegate.NUMBER_FORMATS.PATTERNS[1].negPre = '-\u00A4';
            $delegate.NUMBER_FORMATS.PATTERNS[1].negSuf = '';
          }
          return $delegate;
        }]);
      }]);
Run Code Online (Sandbox Code Playgroud)

这只被调用一次,对任何依赖它的过滤器都有效,并且您不需要为您的货币格式设置自定义过滤器.


Rya*_*ugh 31

这是一种代表负面货币的流行方式.维基百科:

在簿记中,欠款通常用红色数字或括号中的数字表示,作为代表负数的替代符号.

您可以在Angular源代码中看到它们执行此操作(negSuf/ negPre):

function $LocaleProvider(){
  this.$get = function() {
    return {
      id: 'en-us',

      NUMBER_FORMATS: {
        DECIMAL_SEP: '.',
        GROUP_SEP: ',',
        PATTERNS: [
          { // Decimal Pattern
            minInt: 1,
            minFrac: 0,
            maxFrac: 3,
            posPre: '',
            posSuf: '',
            negPre: '-',
            negSuf: '',
            gSize: 3,
            lgSize: 3
          },{ //Currency Pattern
            minInt: 1,
            minFrac: 2,
            maxFrac: 2,
            posPre: '\u00A4',
            posSuf: '',
            negPre: '(\u00A4',
            negSuf: ')',
            gSize: 3,
            lgSize: 3
          }
        ],
        CURRENCY_SYM: '$'
      },
Run Code Online (Sandbox Code Playgroud)

  • 是否有可扩展点可用于覆盖此行为? (6认同)

Cam*_*mel 18

通过检查负数对我来说效果更好:

var app = angular.module('myApp');

app.filter('customCurrency', ["$filter", function ($filter) {       
    return function(amount, currencySymbol){
        var currency = $filter('currency');         

        if(amount < 0){
           return currency(amount, currencySymbol).replace("-", "(") + ')'
        }

        return currency(amount, currencySymbol);
    };
}]);
Run Code Online (Sandbox Code Playgroud)


Leo*_*rdo 10

你的意思是显示 - 10.00美元而不是(10.00美元)?

默认情况下,至少angularJs版本1.2.1将显示括号.例如:(10.00美元)).

如果是这样,这就是我的情况.我为此创建了一个自定义过滤器:

var app = angular.module('myApp');

app.filter('customCurrency', ["$filter", function ($filter) {       
  return function(amount, currencySymbol){
     var currency = $filter('currency');         

     if(amount.charAt(0) === "-"){
        return currency(amount, currencySymbol).replace("(", "-").replace(")", ""); 
     }

     return currency(amount, currencySymbol);
  };

}]);
Run Code Online (Sandbox Code Playgroud)

因此,它委托内置货币过滤器并"装饰"或"取消装饰"括号.

我找不到一种方法来动态更改$ LocaleProvider.如果有人知道,请告诉我.

为莱昂纳多科雷亚喝彩

  • 如果你传入数字,这一行将有所帮助:amount = amount +'';. 它会将数字转换为字符串(不会更改实际数字.否则charAt会导致数字错误. (2认同)

小智 6

更新:Angular 1.4不再使用括号表示负值,但现在使用" - "符号.以下是讨论的链接:https://github.com/angular/angular.js/issues/12870

我使用marc描述的装饰器返回.negPre和.negSuf以使用parens.