有没有办法从货币过滤器的输出中删除小数/美分?我正在做这样的事情:
<div>{{Price | currency}}</div>
哪个输出:
$ 1,000.00
相反,我想:
$ 1,000
可以使用货币过滤器完成吗?我知道我可以将一个美元符号添加到一个数字上,我可以编写自己的过滤器,但我希望现有的货币过滤器存在一种简单的方法。
谢谢。
答案 0 :(得分:114)
更新:从版本 1.3.0 开始 - currencyFilter:将fractionSize添加为可选参数,请参阅commit 并更新了plunker
{{10 | currency:undefined:0}}
请注意,它是第二个参数,因此您需要传入undefined以使用当前的区域设置货币符号
更新:请注意,这仅适用于数字前显示的货币符号。 从版本 1.2.9 开始,它仍然硬编码为2位小数。
Here是一个修改后的版本,它使用angular的formatNumber副本来启用0 fractionSize作为货币。
通常情况下,这应该可以在语言环境定义或currencyFilter调用中配置,但是现在( 1.0.4 )它可以硬编码为2位小数。
自定义过滤器:
myModule.filter('noFractionCurrency',
[ '$filter', '$locale',
function(filter, locale) {
var currencyFilter = filter('currency');
var formats = locale.NUMBER_FORMATS;
return function(amount, currencySymbol) {
var value = currencyFilter(amount, currencySymbol);
var sep = value.indexOf(formats.DECIMAL_SEP);
if(amount >= 0) {
return value.substring(0, sep);
}
return value.substring(0, sep) + ')';
};
} ]);
<强>模板:强>
<div>{{Price | noFractionCurrency}}</div>
示例:强>
更新:修复了处理负值时的错误
答案 1 :(得分:32)
这个问题看起来很旧,给出的答案很好。但是,还有另一种替代方案,它也可以提供帮助(我在项目中使用)。
这非常适用于货币符号前缀以及为正值和负值后缀数字。
自定义过滤器:
angular.module('your-module', [])
.filter('nfcurrency', [ '$filter', '$locale', function ($filter, $locale) {
var currency = $filter('currency'), formats = $locale.NUMBER_FORMATS;
return function (amount, symbol) {
var value = currency(amount, symbol);
return value.replace(new RegExp('\\' + formats.DECIMAL_SEP + '\\d{2}'), '')
}
}])
<强>模板:强>
<div>{{yourPrice| nfcurrency}}</div>
不同语言环境的示例:
请查看US dollars和Danish Krone的实时演示。
<强>更新强>
请注意,此解决方法适用于AngularJS 1.2及更早版本的库。从 AngularJS 1.3 开始,您可以使用currency格式化程序,第三个参数指定分数大小 - “将金额四舍五入的小数位数”。
请注意,要使用来自AngularJS本地化的默认货币格式,您必须使用设置为undefined
的货币符号(第二个参数)(null
或为空不管用)。 US dollars和Danish Krone的演示示例。
答案 2 :(得分:30)
另一件值得考虑的事情是,如果你知道你只有一种语言环境或一种货币,你可以将货币符号放在数字之前,然后像这样使用数字过滤器(对于美国货币)。
${{Price | number:0}}
如果您不想投放新过滤器并且只有一种货币,可以使用更多快速解决方案。
答案 3 :(得分:17)
现在已经晚了,但可能会帮助一些人
{{value | currency : 'Your Symbol' : decimal points}}
让我们看看输出
的一些例子{{10000 | currency : "" : 0}} // 10,000
{{10000 | currency : '$' : 0}} // $10,000
{{10000 | currency : '$' : 2}} // $10,000.00
{{10000 | currency : 'Rs.' : 2}} // Rs.10,000.00
{{10000 | currency : 'USD $' : 2}} // USD $10,000.00
{{10000 | currency : '#' : 3}} // #10,000.000
{{10000 | currency : 'ANYTHING: ' : 5}} // ANYTHING: 10,000.00000
请参阅demo
答案 4 :(得分:5)
这是另一个类似的解决方案,但它会删除.00十进制数,但会留下任何其他小数。
$ 10.00到$ 10
10.20美元至10.20美元
app.filter('noFractionCurrency', [ '$filter', '$locale', function(filter, locale) {
var currencyFilter = filter('currency');
var formats = locale.NUMBER_FORMATS;
return function(amount, currencySymbol) {
amount = amount ? (amount*1).toFixed(2) : 0.00;
var value = currencyFilter(amount, currencySymbol);
// split into parts
var parts = value.split(formats.DECIMAL_SEP);
var dollar = parts[0];
var cents = parts[1] || '00';
cents = cents.substring(0,2)=='00' ? cents.substring(2) : '.'+cents; // remove "00" cent amount
return dollar + cents;
};
}]);
答案 5 :(得分:3)
另一个解决方案,这个删除尾随零并找到最常见货币的正确货币符号:
{{10.00 | money:USD}}至$ 10
{{10.00 | money:EUR}}到€10
/**
* @ngdoc filter
* @name money
* @kind function
*
* @description
* Formats a number as a currency (ie $1,234.56), removing trailing zeros and using the real currency symbol when possible. When no currency symbol is provided, default
* symbol for current locale is used.
*
* @param {number} amount Input to filter.
* @param {string=} symbol Currency symbol or identifier to be displayed.
* @returns {string} Formatted number. *
*/
app.filter('money', [ '$filter', '$locale', function (filter, locale) {
var currencyFilter = filter('currency');
var formats = locale.NUMBER_FORMATS;
var getCurrencySymbol = function (code) {
switch (code.toUpperCase()) {
case 'EUR': //Euro
return '€';
case 'USD': //Dólar americano
case 'MXN': //Peso mejicano
case 'CAD': //Dólar de Canadá
case 'AUD': //Dólar australiano
case 'NZD': //Dólar neozelandés
case 'HKD': //Dólar de Hong Kong
case 'SGD': //Dólar de Singapur
case 'ARS': //Peso argentino
return '$';
case 'CNY': //Yuan chino
case 'JPY': //Yen japonés
return '¥';
case 'GBP': //Libra esterlina
case 'GIP': //Libras de Gibraltar
return '£';
case 'BRL': //Real brasileño
return 'R$';
case 'INR': //Rupia india
return 'Rp';
case 'CHF': //Franco suizo
return 'Fr';
case 'SEK': //Corona sueca
case 'NOK': //Corona noruega
return 'kr';
case 'KPW': //Won de Corea del Norte
case 'KRW': //Won de Corea del Sur
return '₩';
default:
return code;
}
};
return function (amount, currency) {
var value;
if (currency) {
value = currencyFilter(amount, getCurrencySymbol(currency));
}
else {
value = currencyFilter(amount);
}
//Remove trailing zeros
var regex = new RegExp("\\" + formats.DECIMAL_SEP + "0+", "i");
return value.replace(regex, '');
};
} ]);
答案 6 :(得分:3)
角度版本的解决方案&lt; 1.3, 如果您使用i18n,最简单的方法是:
$filter('number')(x,0) + ' ' +$locale.NUMBER_FORMATS.CURRENCY_SYM;
通过这种方式,您可以根据区域设置使用正确的分隔符和货币符号格式化数字。
答案 7 :(得分:3)
对于AngularJS 1.2
您只需合并number
和currency
过滤器
app.filter('noFractionCurrency', ['numberFilter', 'currencyFilter', function(numberFilter, currencyFilter) {
return function(input, symbol) {
var amount = numberFilter(input);
return symbol + amount;
};
}]);
答案 8 :(得分:2)
如果您要汇总到最近的$ 1000:Live Demo:
var app = angular.module('angularjs-starter', []);
app.filter('noFractionRoundUpCurrency',
[ '$filter', '$locale', function(filter, locale) {
var currencyFilter = filter('currency');
var formats = locale.NUMBER_FORMATS;
return function(amount, currencySymbol) {
var value = currencyFilter(amount, currencySymbol);
var sep = value.indexOf(formats.DECIMAL_SEP);
if(amount >= 0) {
if (amount % 1000 < 500){
return '$' + (amount - (amount % 500));
} else {
return '$' + (amount - (amount % 500) + 500);
}
}
else{
if (-amount % 1000 < 500){
return '($' + (-amount - (-amount % 500)) + ')';
} else {
return '($' + (-amount - (-amount % 500) + 500)+ ')';
}
}
};
} ]);
app.controller('MainCtrl', function($scope) {
});
答案 9 :(得分:2)
正是我需要的!
我添加了一个条件来完全替换Angular的货币过滤器,并且只使用@Tom上面看到的过滤器的修改版本。我确信有更好的方法可以做到这一点,但到目前为止它似乎对我有用。
'use strict';
angular.module('your-module')
.filter('nfcurrency', [ '$filter', '$locale', function ($filter, $locale) {
var currency = $filter('currency'), formats = $locale.NUMBER_FORMATS;
return function (amount, symbol) {
var value = currency(amount, symbol), valArr = value.split(formats.DECIMAL_SEP);
if(parseInt(valArr[(valArr.length - 1)]) > 0) {
return value;
} else {
return value.replace(new RegExp('\' + formats.DECIMAL_SEP + '\d{2}'), '');
}
};
}]);
答案 10 :(得分:2)
我已经修改了@Liviu T.发布的过滤器,以接受带有符号的货币后的数字和一定的小数位数:
app.filter('noFractionCurrency',
[ '$filter', '$locale', function(filter, locale) {
var currencyFilter = filter('currency');
var formats = locale.NUMBER_FORMATS;
return function(amount, num, currencySymbol) {
if (num===0) num = -1;
var value = currencyFilter(amount, currencySymbol);
var sep = value.indexOf(formats.DECIMAL_SEP)+1;
var symbol = '';
if (sep<value.indexOf(formats.CURRENCY_SYM)) symbol = ' '+formats.CURRENCY_SYM;
return value.substring(0, sep+num)+symbol;
};
} ]);
例如:
{{10.234 | noFractionCurrency:0}}
{{10.55555 | noFractionCurrency:2}}
输出:
$10
$10.56
答案 11 :(得分:2)
如果您使用angular-i18n(bower install angular-i18n
),则可以使用装饰器更改区域设置文件中的默认值,如下所示:
$provide.decorator('$locale', ['$delegate',
function ($delegate) {
$delegate.NUMBER_FORMATS.PATTERNS[1].maxFrac = 0;
$delegate.NUMBER_FORMATS.PATTERNS[1].minFrac = 0;
return $delegate;
}]);
请注意,这适用于代码中的所有货币过滤器使用。
答案 12 :(得分:0)
在Angular 4+中
{{totalCost | currency : 'USD' : 'symbol' : '1.0-0' }}