import { Directive } from '@angular/core'; import { NgModel } from '@angular/forms'; import { CurrencyPipe } from '@angular/common'; @Directive({ selector: '[ngModel][my-directive]', providers: [NgModel, CurrencyPipe], host: { '(blur)': 'onInputChange($event)' } }) export class MyDirective { constructor(private model: NgModel, private currencyPipe: CurrencyPipe) { } onInputChange($event) { var value = $event.target.value; if (!value) return; var plainNumber: number; var formattedValue: string; var decimalSeparatorIndex = value.lastIndexOf('.'); if (decimalSeparatorIndex > 0) { // if input has decimal part var wholeNumberPart = value.substring(0, decimalSeparatorIndex); var decimalPart = value.substr(decimalSeparatorIndex + 1); plainNumber = parseFloat(wholeNumberPart.replace(/[^\d]/g, '') + '.' + decimalPart) } else { // input does not have decimal part plainNumber = parseFloat(value.replace(/[^\d]/g, '')); } if (!plainNumber) { formattedValue = ''; } else { formattedValue = this.currencyPipe.transform(plainNumber.toFixed(2), "USD", "symbol-narrow"); } this.model.valueAccessor.writeValue(formattedValue); } }
Then to use it on HTML part:
<input name="productPrice" [(ngModel)]="price" my-directive />