我需要一個指令來過濾貨幣的字段,因此用戶只需鍵入並隱含小數。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