【问题标题】:Why AngularJS currency filter formats negative numbers with parenthesis?为什么AngularJS货币过滤器用括号格式化负数?
【发布时间】:2013-06-30 17:53:23
【问题描述】:

Live Demo

为什么会这样:

# Controller
$scope.price = -10;

# View
{{ price | currency }}

导致($10.00) 而不是-$10.00

【问题讨论】:

标签: angularjs angularjs-filter


【解决方案1】:

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

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

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

【讨论】:

  • 很好的答案,按预期工作。这应该投赞成票!谢谢!!
  • 当这个被缩小时我有错误'未知提供者:aProvider
  • @JonHarding 看来我错过了正确注入代表团;根据to this 装饰器的$delegate 可以提供一个注入数组。我会相应地编辑答案。
  • @KishoreRelangi 是的,只需将 negPre = '-\u00A4' 替换为 negPre = '\u00A4-'
  • 谢谢,这就是我要找的。​​span>
【解决方案2】:

这是表示负数货币的一种流行方式。 Wikipedia:

在簿记中,欠款通常用红色数字或括号中的数字表示,作为表示负数的另一种表示法。

您可以在 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: '$'
      },

【讨论】:

  • 是否有可用于覆盖此行为的扩展点?
  • @DMactheDestroyer 您可以使用装饰器,如my answer中所述
  • @marc,你是对的,谢谢!这比自定义过滤器要优雅得多。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    您的意思是显示 -$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);
      };
    
    }]);
    

    因此它委托给内置货币过滤器并“装饰”或“取消装饰”括号。

    我找不到即时更改 $LocaleProvider 的方法。如果有人知道,请告诉我。

    干杯 莱昂纳多·科雷亚

    【讨论】:

    • 如果你传入数字,这条线会有所帮助:amount = amount + '';。它将数字转换为字符串(不更改实际数字。否则 charAt 会导致数字错误。
    • @Leonardo 在这个例子中你如何使用它?你能把{{ product.discount | currency:undefined:0 }}改成{{ product.discount | customCurrency:undefined:0 }}吗(我是angularJS 1.5的新手)
    • @Bowersbros 您会将amount = amount + "; 放在函数的哪个位置?
    【解决方案5】:

    更新:Angular 1.4 不再使用括号来表示负值,而是使用“-”符号。这是讨论的链接:https://github.com/angular/angular.js/issues/12870

    我使用了 marc 描述的装饰器来返回 .negPre 和 .negSuf 以使用括号。

    【讨论】:

      【解决方案6】:

      如果您不介意保留括号,而只是想要一种快速简便的方法来实现这一点
      例如:-($250.00),请尝试以下操作:

      <ul ng-repeat="data in customers">
        <li>
          Balance: 
          <span ng-if="data.balance<0">-</span>
          <span ng-if="data.balance>0">+</span>
          {{data.balance | currency}}
        </li>
      </ul>  
      

      如果您想删除(),则可以创建自己的过滤器或尝试其他答案。

      【讨论】:

        【解决方案7】:

        围绕行号编辑 angular.js 文件 -36180 通过删除 - 并放置括号来更改 negPre 和 negSuf

        举例

        更改自:

        "NUMBER_FORMATS": {
        "CURRENCY_SYM": "$",
        "DECIMAL_SEP": ".",
        "GROUP_SEP": ",",
        "PATTERNS": [
          {
            "gSize": 3,
            "lgSize": 3,
            "maxFrac": 3,
            "minFrac": 0,
            "minInt": 1,
            "negPre": "-",
            "negSuf": "",
            "posPre": "",
            "posSuf": ""
          },
          {
            "gSize": 3,
            "lgSize": 3,
            "maxFrac": 2,
            "minFrac": 2,
            "minInt": 1,
            "negPre": "-\u00a4",
            "negSuf": "",
            "posPre": "\u00a4",
            "posSuf": ""
          }
        ]
        

        }

        收件人

        "NUMBER_FORMATS": {
        "CURRENCY_SYM": "$",
        "DECIMAL_SEP": ".",
        "GROUP_SEP": ",",
        "PATTERNS": [
          {
            "gSize": 3,
            "lgSize": 3,
            "maxFrac": 3,
            "minFrac": 0,
            "minInt": 1,
            "negPre": "-",
            "negSuf": "",
            "posPre": "",
            "posSuf": ""
          },
          {
            "gSize": 3,
            "lgSize": 3,
            "maxFrac": 2,
            "minFrac": 2,
            "minInt": 1,
            "negPre": "(\u00a4",
            "negSuf": ")",
            "posPre": "\u00a4",
            "posSuf": ""
          }
        ]
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-22
          • 2013-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多