मैं @omeralper द्वारा दिए गए उत्तर पर निर्माण करना चाहूंगा, जिसने मेरी राय में एक ठोस समाधान के लिए एक अच्छी नींव प्रदान की।
मैं जो प्रस्ताव कर रहा हूं वह नवीनतम वेब मानकों के साथ एक सरलीकृत और अद्यतित संस्करण है। यह ध्यान रखना महत्वपूर्ण है कि event.keycode वेब मानकों से हटा दिया गया है, और भविष्य के ब्राउज़र अपडेट अब इसका समर्थन नहीं कर सकते हैं। Https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyTode देखें
इसके अलावा, विधि
String.fromCharCode(e.keyCode);
यह गारंटी नहीं देता है कि की -कोड उपयोगकर्ता के कीबोर्ड पर पहचाने जाने वाले अपेक्षित पत्र के लिए उपयोगकर्ता के नक्शे द्वारा दबाए जाने वाली कुंजी से संबंधित है, क्योंकि विभिन्न कीबोर्ड कॉन्फ़िगरेशन में एक विशेष कीकोड अलग-अलग वर्ण होंगे। इसका उपयोग करने से उन बगों का परिचय होगा जिनकी पहचान करना मुश्किल है, और कुछ उपयोगकर्ताओं के लिए कार्यक्षमता को आसानी से तोड़ सकते हैं। बल्कि मैं Event.key का उपयोग करने का प्रस्ताव दे रहा हूं, यहां डॉक्स देखें https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
इसके अलावा, हम केवल यह चाहते हैं कि परिणामी आउटपुट एक वैध दशमलव है। इसका मतलब है कि संख्या 1, 11.2, 5000.2341234 को स्वीकार किया जाना चाहिए, लेकिन मूल्य 1.1.2 को स्वीकार नहीं किया जाना चाहिए।
ध्यान दें कि मेरे समाधान में मैं कट, कॉपी और पेस्ट कार्यक्षमता को छोड़ रहा हूं क्योंकि यह बग के लिए खिड़कियां खोलता है, खासकर जब लोग संबंधित क्षेत्रों में अवांछित पाठ पेस्ट करते हैं। कि कीप हैंडलर पर एक सफाई प्रक्रिया की आवश्यकता होगी; जो इस धागे का दायरा नहीं है।
यहाँ समाधान है मैं प्रस्ताव कर रहा हूँ।
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
selector: '[myNumberOnly]'
})
export class NumberOnlyDirective {
private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);
private specialKeys: Array<string> = [ 'Backspace', 'Tab', 'End', 'Home' ];
constructor(private el: ElementRef) {
}
@HostListener('keydown', [ '$event' ])
onKeyDown(event: KeyboardEvent) {
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
let current: string = this.el.nativeElement.value;
let next: string = current.concat(event.key);
if (next && !String(next).match(this.regex)) {
event.preventDefault();
}
}
}