2015-07-14 2 views
0

Я разрабатываю угловой фильтр, который округляет до шести десятичных знаков. Я не могу понять, как округлить до 2 десятичных знаков, когда десятичные знаки содержат только нули. Таким образом, 1.00000 будет конвертироваться в 1.00. Это то, что мой фильтр выглядит следующим образом:Как управлять округлением в угловом фильтре?

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

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

     debugger; 
     if (fractionSize !== undefined) { 
      amount = currency(amount, currencySymbol, fractionSize); 
     } else { 
      amount = currency(amount, currencySymbol) 
     } 


     debugger; 
     var amounts = amount.split("."); 
     var amountHtml ; 

     if (amounts[1].length==2 && amounts[1][0]==0 && amounts[1][1]==0) 
     { 
      amountHtml = amounts[0] + '<span class="decimals">.00</span>'; 
     } 
     else 
     { 
      amountHtml= amounts[0] + '<span class="decimals">.' + amounts[1] + '</span>'; 

     } 
     return amountHtml; 
    }; 
}); 

plunkr: http://plnkr.co/edit/cGmYcsqwn3huanOeX4g4?p=preview

+0

I thinki вы проходя размер фракции wrong.Instead 6 проход 2 –

ответ

0

Не уверен, что это будет работать для вас в долгосрочной перспективе, я уверен, есть лучший способ сделать это, но если вы хотите быстро и грязно исправить, попробуйте это:

DEMO

app.filter('customCurrency',function ($filter) { 

    return function (amount, currencySymbol, fractionSize) { 

     var currency = $filter('currency'); 

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

     debugger; 
     if (fractionSize !== undefined) { 
      amount = currency(amount, currencySymbol, fractionSize); 
     } else { 
      amount = currency(amount, currencySymbol) 
     } 


     debugger; 

     var amounts   = amount.split("."), 
      fractionalPart = amounts[1], 
      decimals  = fractionalPart.length, 
      zerosFromRight = countZerosFromRight(fractionalPart); 


     if(zerosFromRight > 2){ 
      return amounts[0] + '<span class="decimals">.00</span>'; 
     } 

     return amounts[0] + '<span class="decimals">.' + amounts[1] + '</span>'; 
     /////////////////////////////////// 

     function countZerosFromRight(str){ 

      var len = str.length, 
       count = 0; 

      while(len--){ 

      if(str[len] === '0'){ 
       count++; 
       continue; 
      } 

      break; 
      } 

      return count 
     } 


    }; 
}); 

EDIT Если бы переосмыслить и думаю, что этот путь лучше:

Я добавил этот тест и, возможно, вам не нужна эта функция, но я думаю, что это немного более надежным.

DEMO2

it('should only remove the zeros up to the last non-zero number', function() { 
    expect($filter('customCurrency')(1.004000, '$', 6)).toEqual('$1<span class="decimals">.004</span>'); 
    expect($filter('customCurrency')(1.4066000, '$', 6)).toEqual('$1<span class="decimals">.4066</span>'); 
    }); 

app.js

var app = angular.module('plunker', ['ngRoute']); 

'use strict'; 

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

app.filter('customCurrency',function ($filter) { 

    return function (amount, currencySymbol, fractionSize) { 

     var currency = $filter('currency'); 

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

     debugger; 

     var rounded   = round(amount, fractionSize), 
      currencyString = currency(rounded, currencySymbol, fractionSize), 
      amounts   = currencyString.split("."), 

      integerPart  = amounts[0], 
      fractionalPart = amounts[1] || false, 
      indexLastNonZero = indexLastNonZero(fractionalPart); 

     // if only zeros after decimal then remove all but 2 
     if(indexLastNonZero === -1){ 
      return integerPart + '<span class="decimals">.00</span>'; 
     } 

     // if zeros and other numbers after decimal remove all trailing zeros 
     if(indexLastNonZero > 1){ 
      return integerPart + '<span class="decimals">.' + fractionalPart.slice(0, indexLastNonZero + 1) + '</span>'; 
     } 

     return integerPart; 
     ///////////////////////////////////////////// 

     function round(str, decimals){ 
      var num = +str; 

      return num.toFixed(decimals); 
     } 

     function indexLastNonZero(str){ 
      var len = str.length; 

      while(len--){ 

      if(str[len] !== '0'){ 
       return len; 
      } 
      } 

      return -1; 
     } 

    }; 
}); 
+0

отличная работа, но одна ошибка: 1,4066000 должна быть 1,4066 – Leeuwtje

+0

Если бы другой идти. Обновлено второе демо и код. Это то, к чему вы стремились? –

+0

Удивительная благодарность кучи – Leeuwtje

0

попробовать это один

it('if I have 3 zeros or more in decimals only display max of 2 zeros in decimals', function() { 
    // using $filter 
    expect($filter('customCurrency')(1.000, '$', 2)).toEqual('$1<span class="decimals">.00</span>'); 
    }); 
Смежные вопросы