我需要一个指令来过滤货币的字段,因此用户只需键入并隐含小数。Angular中的Money格式化指令
需求:
- 格式小数字段的用户类型 -
开始在百位的用户类型。因此,他们可以键入 “4” 看 “0.04”,输入 “42”,并看到 “0.42”,类型298023和看 “2980.23”
- 字段必须是数字
- 必须允许底片
-
- 允许0.00为数字输入
- 理想的情况下将使用类型=“数字”,而是“类型=文本”是正常
- 您应该能够清除该字段为空。
ng货币筛选器不能按原样满足这些要求。请参阅猛击者的行为以了解我的意思。
我的First Plunker有`input = text'并允许负数。一个问题是,你不能输入负数作为第一个数字。当清除该字段时,它将返回到“0.00”,但它应该完全清除。
app.directive('format', ['$filter', function ($filter) {
return {
require: 'ngModel', //there must be ng-model in the html
link: function (scope, elem, attr, ctrl) {
if (!ctrl) return;
ctrl.$parsers.unshift(function (viewValue, modelValue) {
var plainNumber = viewValue.replace(/[^-+0-9]/g,'');
var newVal = plainNumber.charAt(plainNumber.length-1);
var positive = plainNumber.charAt(0) != '-';
if(isNaN(plainNumber.charAt(plainNumber.length-1))){
plainNumber = plainNumber.substr(0,plainNumber.length-1)
}
//use angular internal 'number' filter
plainNumber = $filter('number')(plainNumber/100, 2).replace(/,/g, '');
if(positive && newVal == '-'){
plainNumber = '-' + plainNumber;
}
else if(!positive && newVal == '+'){
plainNumber = plainNumber.substr(1);
}
plainNumber.replace('.', ',');
//update the $viewValue
ctrl.$setViewValue(plainNumber);
//reflect on the DOM element
ctrl.$render();
//return the modified value to next parser
return plainNumber;
});
}
};
}]);
我Second Plunker有input = text
并允许负输入。就像第一个闯入者一样,只有在输入数字后,它才会允许第一个字符为负数。第二个是它从十分之一而不是百分之一开始。 (如果你输入“3”,你应该看到“0.03”,但在这里它显示了“0.3”)
app.directive('inputRestrictor', [function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ngModelCtrl) {
var pattern = /[^.0-9+-]/g;
function fromUser(text) {
if (!text)
return text;
var rep = /[+]/g;
var rem = /[-]/g;
rep.exec(text);
rem.exec(text);
var indexp = rep.lastIndex;
var indexm = rem.lastIndex;
text = text.replace(/[+.-]/g, '');
if (indexp > 0 || indexm > 0) {
if (indexp > indexm) text = "+" + text; // plus sign?
else text = "-" + text;
}
var transformedInput = text.replace(pattern, '');
transformedInput = transformedInput.replace(/([0-9]{1,2}$)/, ".$1")
ngModelCtrl.$setViewValue(transformedInput);
ngModelCtrl.$render();
return transformedInput;
}
ngModelCtrl.$parsers.push(fromUser);
}
};
}]);
我如何协调这些解决方案或定制一个符合要求?我想避免额外的库或附加组件。我被告知,最好的方法是研究货币过滤器的来源,并重新创建具有额外要求的过滤器。我很乐意这样做,但我现在真的没有这方面的技能。这两个指令是我的。
的角度提供一个内置的货币过滤器:https://docs.angularjs.org/api/ng/filter/currency –
@ SSC-hrep3该过滤器是好的,但它不符合作为用户类型添加小数点的要求。这是指令的目的。要明白我的意思,请输入plunker字段,看看会发生什么。 – jenryb
嗨,[ng-currency](https://github.com/aguirrel/ng-currency)很有帮助。 – Maher