有没有办法从货币过滤器的输出中删除小数/美分?我正在做这样的事情:
<div>{{Price | currency}}</div>
哪个输出:
$1,000.00
相反,我想:
1,000 美元
可以使用货币过滤器来完成吗?我知道我可以在数字前加上美元符号,并且可以编写自己的过滤器,但我希望现有货币过滤器存在一个简单的方法。
谢谢你。
有没有办法从货币过滤器的输出中删除小数/美分?我正在做这样的事情:
<div>{{Price | currency}}</div>
哪个输出:
$1,000.00
相反,我想:
1,000 美元
可以使用货币过滤器来完成吗?我知道我可以在数字前加上美元符号,并且可以编写自己的过滤器,但我希望现有货币过滤器存在一个简单的方法。
谢谢你。
更新:从1.3.0版开始 -currencyFilter :添加 fractionSize 作为可选参数,请参阅提交 和更新的 plunker
{{10 | currency:undefined:0}}
请注意,它是第二个参数,因此您需要传入 undefined 以使用当前的语言环境货币符号
更新:请注意,这仅适用于显示在数字之前的货币符号。从1.2.9版开始,它仍然被硬编码到小数点后 2 位。
这是一个修改后的版本,它使用 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>
例子:
更新:修复了处理负值时的错误
这个问题似乎很老了,给出的答案很好。但是,还有另一种替代解决方案也可以提供帮助(我在我的项目中使用)。
这非常适用于货币符号前缀以及正负值的数字后缀。
自定义过滤器:
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>
不同语言环境的示例:
更新
请注意,此解决方法适用于 AngularJS 1.2 和早期版本的库。从AngularJS 1.3开始,您可以使用带有指定分数大小的第三个参数的货币格式化程序 - “将金额四舍五入的小数位数”。
请注意,为了使用来自 AngularJS 本地化的默认货币格式,您必须将货币符号(第二个参数)设置为undefined
(null
否则为空将不起作用)。美元和丹麦克朗的演示示例。
另一件值得考虑的事情是,如果您知道您只有一种语言环境或一种货币,您可以将货币符号放在数字之前,然后像这样使用数字过滤器(对于美国货币)。
${{Price | number:0}}
如果您不想添加新过滤器并且只有一种货币,则可以使用更多快速修复解决方案。
已经晚了,但可能对某人有帮助
{{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
查看演示
这是另一个类似的解决方案,但它删除了小数点 .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;
};
}]);
角度版本 < 1.3 的解决方案,如果您使用 i18n,最简单的方法是:
$filter('number')(x,0) + ' ' +$locale.NUMBER_FORMATS.CURRENCY_SYM;
这样,您就可以根据区域设置使用正确的分隔符和货币符号格式化数字。
另一种解决方案是删除尾随零并为最常见的货币找到正确的货币符号:
{{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, '');
};
} ]);
如果你想四舍五入到最接近的 1000 美元: 现场演示:
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) {
});
正是我需要的!
我添加了一个条件来完全替换 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}'), '');
}
};
}]);
我对@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
如果您使用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;
}]);
请注意,这将适用于您的代码中使用的所有货币过滤器。
在角 4+
{{totalCost | currency : 'USD' : 'symbol' : '1.0-0' }}