$formatters, $parsers and $filter are used as part of the codes.
myApp.directive('formatCurrency', ['$filter', '$locale', function ($filter, $locale) {
return {
require: '?ngModel',
link: function (scope, elem, attrs, ctrl) {
if (!ctrl) return;
// $formatters is used to process value from code to view
ctrl.$formatters.unshift(function (modelValue) {
var formattedValue;
if (modelValue) {
formattedValue = $filter('currency', null, 2)(modelValue); // use $filter to do some formatting
} else {
formattedValue = '';
}
return formattedValue;
});
// $parsers is used to process value from view to code
ctrl.$parsers.unshift(function (viewValue) {
var plainNumber;
var formattedValue;
var decimalSeparatorIndex = viewValue.lastIndexOf($locale.NUMBER_FORMATS.DECIMAL_SEP); // $locale.NUMBER_FORMATS.DECIMAL_SEP variable is the decimal separator for the current culture
if (decimalSeparatorIndex > 0) {
// if input has decimal part
var wholeNumberPart = viewValue.substring(0, decimalSeparatorIndex);
var decimalPart = viewValue.substr(decimalSeparatorIndex + 1, 2);
plainNumber = parseFloat(wholeNumberPart.replace(/[^\d]/g, '') + '.' + decimalPart).toFixed(2); // remove any non number characters and round to two decimal places
formattedValue = $filter('currency', null, 2)(plainNumber);
formattedValue = formattedValue.substring(0, formattedValue.lastIndexOf($locale.NUMBER_FORMATS.DECIMAL_SEP) + 1);
formattedValue = formattedValue + decimalPart;
} else {
// input does not have decimal part
plainNumber = parseFloat(viewValue.replace(/[^\d]/g, ''));
formattedValue = $filter('currency', null, 0)(plainNumber); // the 0 argument for no decimal does not work (issue with Angular)
if (formattedValue) {
// remove the decimal part
formattedValue = formattedValue.substring(0, formattedValue.lastIndexOf($locale.NUMBER_FORMATS.DECIMAL_SEP));
} else {
formattedValue = viewValue;
}
}
elem.val(formattedValue);
return plainNumber;
});
}
};
}]);
To use it on an input field:
<input type="text" ng-model="vm.myVariable" format-currency/>
For a working example, please see this on Plunker.

No comments:
Post a Comment