Ho bisogno di una direttiva per filtrare un campo per la valuta, quindi un utente deve solo digitare e il decimale è implicito.Direttiva di formattazione del denaro in Angular
Bisogni:
- Formato campo decimale come utente digita -
Inizia nel luogo centesimi mentre l'utente. Così avrebbero digitare "4" e vedere "0,04", tipo "42" e vedere "0.42", tipo 298023 e vedere "2.980,23"
- Il campo deve essere un numero
- deve consentire negativi
-
- consentire 0.00 come ingresso numero
- Preferirei usare type = "numero", ma "type = text" va bene
- Si dovrebbe essere in grado di cancellare il campo per essere vuoto.
Il filtro di valuta ng non soddisfa questi requisiti così com'è. Si prega di vedere il comportamento in plunkers per vedere cosa intendo.
Il mio First Plunker ha `input = testo 'e consente numeri negativi. Un problema è che non è possibile digitare un negativo come il primo numero. Quando si cancella il campo, ritorna a "0.00" ma dovrebbe essere completamente cancellato.
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;
});
}
};
}]);
mio Second Plunker ha input = text
e permette di ingresso negativo. Come il primo plunker, non consentirà un negativo come primo carattere, solo dopo aver digitato i numeri. Il secondo è che inizia al decimo posto anziché al centesimo. (Se si digita '3' si dovrebbe vedere '0.03' ma qui si vede '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);
}
};
}]);
Come posso conciliare queste soluzioni o su misura uno per soddisfare i requisiti? Voglio evitare librerie o componenti aggiuntivi aggiuntivi. Mi è stato detto che l'approccio migliore sarebbe studiare la fonte del filtro di valuta e ricreare quel filtro con i requisiti aggiuntivi. Mi piacerebbe farlo, ma in questo momento non ne ho le capacità. Queste due direttive sono ciò che ho.
angolare dispone di un filtro di valuta costruito in: https://docs.angularjs.org/api/ng/filter/currency –
@ SSC-hrep3 che il filtro è bello, ma non soddisfa il requisiti per l'aggiunta di un punto decimale come tipi di utente. Questo è ciò che la direttiva è per. Per vedere cosa intendo, digita il campo plunker e guarda cosa succede. – jenryb
Salve, [valuta-ng] (https://github.com/aguirrel/ng-currency) è utile. – Maher