Почему фильтр валют AngularJS форматирует отрицательные числа с круглыми скобками?

Live Demo

Почему это:

# Controller
$scope.price = -10;

# View
{{ price | currency }}

результаты в ($10.00) скорее, чем -$10.00?

7 ответов

Решение

Это популярный способ представления отрицательных валют. Википедия:

В бухгалтерском учете суммы задолженности часто обозначаются красными цифрами или цифрами в скобках в качестве альтернативного обозначения для представления отрицательных чисел.

Вы можете увидеть в исходном коде 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: '$'
      },

Я знаю, что это старый вопрос, но принятый ответ только отвечает на вопрос, почему это происходит, без конкретного решения проблемы. Я думаю, что "самый правильный способ" сделать это - использовать декоратор так:

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

Это вызывается только один раз, действительно для любого фильтра, который зависит от него, и вам не нужен специальный фильтр для форматирования вашей валюты.

Это работает лучше для меня, проверяя отрицательное число:

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

Вы имеете в виду дисплей - 10 долларов, а не (10 долларов)?

По умолчанию, по крайней мере, 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 на лету. Если кто-то знает, пожалуйста, дайте мне знать.

ура Леонардо Корреа

Обновление: Angular 1.4 больше не использует скобки для обозначения отрицательных значений, но теперь использует символ "-". Вот ссылка на обсуждение: https://github.com/angular/angular.js/issues/12870

Я использовал декоратор, как описано в marc, чтобы вернуть.negPre и.negSuf для использования паренов.

Если вы не против сохранить скобки и просто хотите быстро и легко добиться этого
например: -($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>  

Если вы хотите удалить ()Затем вы можете создать свой собственный фильтр или попробовать другие ответы.

Отредактируйте файл 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": ""
  }
]

}

Другие вопросы по тегам