Не уверен, что это будет работать для вас в долгосрочной перспективе, я уверен, есть лучший способ сделать это, но если вы хотите быстро и грязно исправить, попробуйте это:
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;
}
};
});
I thinki вы проходя размер фракции wrong.Instead 6 проход 2 –