2017-01-23 38 views

Trả lời

3

Tôi đã nhận các giải pháp sử dụng @ ống

import { Directive,Input,Inject, HostListener, ElementRef, OnInit } from "@angular/core"; 


const PADDING = "000000"; 

@Pipe({ name: "CurrencyPipe" }) 
export class CurrencyPipe implements PipeTransform { 
    transform(value: any, args: string[]): any { 
    var clean = value.replace(/[^-0-9\.]/g, ''); 
    var negativeCheck = clean.split('-'); 
    var decimalCheck = clean.split('.'); 

    if (negativeCheck[1] != undefined) { 
         negativeCheck[1] = negativeCheck[1].slice(0, negativeCheck[1].length); 
         clean = negativeCheck[0] + '-' + negativeCheck[1]; 
         if (negativeCheck[0].length > 0) { 
          clean = negativeCheck[0]; 
         } 

        } 
     if (decimalCheck[1] != undefined) { 
         decimalCheck[1] = decimalCheck[1].slice(0, 2); 
         clean = decimalCheck[0] + '.' + decimalCheck[1]; 
        } 

    return clean; 
    } 

    parse(value: string, fractionSize: number = 2): string { 

    var clean = value.replace(/[^-0-9\.]/g, ''); 
    var negativeCheck = clean.split('-'); 
    var decimalCheck = clean.split('.'); 

    if (negativeCheck[1] != undefined) { 
         negativeCheck[1] = negativeCheck[1].slice(0, negativeCheck[1].length); 
         clean = negativeCheck[0] + '-' + negativeCheck[1]; 
         if (negativeCheck[0].length > 0) { 
          clean = negativeCheck[0]; 
         } 

        } 
     if (decimalCheck[1] != undefined) { 
         decimalCheck[1] = decimalCheck[1].slice(0, 2); 
         clean = decimalCheck[0] + '.' + decimalCheck[1]; 
        } 

    return clean; 
    } 

} 

Và ống mở rộng trong chỉ thị của tôi.

import { Directive, Input, Inject, HostListener, OnChanges, ElementRef, Renderer, AfterViewInit, OnInit } from "@angular/core"; 
import { CurrencyPipe } from '../../shared/pipe/orderby'; 

@Directive({ selector: "[CurrencyFormatter]" }) 
export class CurrencyFormatterDirective { 

    private el: HTMLInputElement; 

    constructor(
    private elementRef: ElementRef, 
    private currencyPipe: CurrencyPipe 
) { 
    this.el = this.elementRef.nativeElement; 
    } 

    ngOnInit() { 
    this.el.value = this.currencyPipe.parse(this.el.value); 
    } 

    @HostListener("focus", ["$event.target.value"]) 
    onFocus(value) { 
    this.el.value = this.currencyPipe.parse(value); // opossite of transform 
    } 

    @HostListener("blur", ["$event.target.value"]) 
    onBlur(value) { 
    this.el.value = this.currencyPipe.parse(value); 
    } 

    @HostListener("keyup", ["$event.target.value"]) 
    onKeyUp(value) { 
    this.el.value = this.currencyPipe.parse(value); 
    } 



} 

nhập thị về thành phần của bạn

import { CurrencyFormatterDirective } from '../../shared/directive/showOnRowHover'; 
import { CurrencyPipe } from '../../shared/pipe/orderby'; 
providers: [CurrencyPipe, 
      CurrencyFormatterDirective] 

Và Chỉ thị về Input html của bạn

<input type="text" [(ngModel)]="invoiceDetail.InvoiceAmount" class="form-control" placeholder="Enter invoice amount" 
      CurrencyFormatter> 
+1

Điều này làm việc tốt, nhưng tôi đã phải nhập khẩu PipeTransform từ lõi, và thêm các đường ống như một nhà cung cấp trong chỉ thị để có được nó tiêm, và thêm nó vào khai báo mô-đun của tôi – user917170

-1
<input type='number' step='0.01' value='0.00' placeholder='0.00' /> 

không sử dụng Step sử dụng step và nếu bạn vẫn muốn hỗ trợ cũ của trình duyệt của bạn có thể lựa chọn mã javascript cho cùng

+3

Không hạn chế người dùng nhập nhiều hơn 2 thập phân. –

1

Xem demo của bên dưới chỉ thị trong Plnkr.

Bạn có thể đạt được điều này bằng cách sử dụng chỉ thị sau:

import { Directive, ElementRef, HostListener, Input } from '@angular/core'; 

@Directive({ 
    selector: '[OnlyNumber]' 
}) 
export class OnlyNumber { 
    elemRef: ElementRef 

    constructor(private el: ElementRef) { 
    this.elemRef = el 
    } 

    @Input() OnlyNumber: boolean; 
    @Input() DecimalPlaces: string; 
    @Input() minValue: string; 
    @Input() maxValue: string; 

    @HostListener('keydown', ['$event']) onKeyDown(event) { 
    let e = <KeyboardEvent> event; 
    if (this.OnlyNumber) { 
     if ([46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 || 
     // Allow: Ctrl+A 
     (e.keyCode == 65 && e.ctrlKey === true) || 
     // Allow: Ctrl+C 
     (e.keyCode == 67 && e.ctrlKey === true) || 
     // Allow: Ctrl+X 
     (e.keyCode == 88 && e.ctrlKey === true) || 
     // Allow: home, end, left, right 
     (e.keyCode >= 35 && e.keyCode <= 39)) { 
      // let it happen, don't do anything 
      return; 
     } 
     // Ensure that it is a number and stop the keypress 
     if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) { 
      e.preventDefault(); 
     } 
     } 
    } 

    @HostListener('keypress', ['$event']) onKeyPress(event) { 
    let e = <any> event 

    let valInFloat: number = parseFloat(e.target.value) 

    if(this.minValue.length) { 
     // (isNaN(valInFloat) && e.key === "0") - When user enters value for first time valInFloat will be NaN, e.key condition is 
     // because I didn't want user to enter anything below 1. 
     // NOTE: You might want to remove it if you want to accept 0 
     if(valInFloat < parseFloat(this.minValue) || (isNaN(valInFloat) && e.key === "0")) { 
     e.preventDefault(); 
     } 
    } 

    if(this.maxValue.length) { 
     if(valInFloat > parseFloat(this.maxValue)) { 
     e.preventDefault(); 
     } 
    } 

    if (this.DecimalPlaces) { 
     let currentCursorPos: number = -1;  
     if (typeof this.elemRef.nativeElement.selectionStart == "number") { 
      currentCursorPos = this.elemRef.nativeElement.selectionStart; 
     } else { 
     // Probably an old IE browser 
     console.log("This browser doesn't support selectionStart"); 
     } 

     let dotLength: number = e.target.value.replace(/[^\.]/g, '').length 
     // If user has not entered a dot(.) e.target.value.split(".")[1] will be undefined 
     let decimalLength = e.target.value.split(".")[1] ? e.target.value.split(".")[1].length : 0; 

     // (this.DecimalPlaces - 1) because we don't get decimalLength including currently pressed character 
     // currentCursorPos > e.target.value.indexOf(".") because we must allow user's to enter value before dot(.) 
     // Checking Backspace etc.. keys because firefox doesn't pressing them while chrome does by default 
     if(dotLength > 1 || (dotLength === 1 && e.key === ".") || (decimalLength > (parseInt(this.DecimalPlaces) - 1) && 
     currentCursorPos > e.target.value.indexOf(".")) && ["Backspace", "ArrowLeft", "ArrowRight"].indexOf(e.key) === -1) { 
     e.preventDefault(); 
     } 
    } 
    } 
} 

Việc sử dụng HTML như sau:

<input type="text" OnlyNumber="true" DecimalPlaces="2" minValue="1.00" maxValue="999999999.00"> 

Nếu bạn tìm thấy bất kỳ lỗi với nó xin vui lòng cho tôi biết trong các ý kiến ​​dưới đây.

P.S: Chỉ thị này được cải thiện theo cách này answer để xác thực các điểm thập phân.

+0

Trên Chrome (Phiên bản 58.0.3029.110), Góc 2.4.0 - kiểm tra các chữ số thập phân không hoạt động (this.elemRef.nativeElement.selectionStart là null). Nhưng chỉ thị thực sự gọn gàng khác. – nbo

+0

Cảm ơn. Tôi đang sử dụng Angular 4.0.0 và chrome 57.0.2987.133 (64-bit) trên OS X El Capitan. Tôi đã sửa một lỗi firefox và bây giờ nó cũng đang làm việc trên Firefox v53. Vui lòng đề xuất chỉnh sửa nếu bạn tìm thấy cách giải quyết – Dhyey

+0

@Dhyey Nếu bạn nhập số thập phân và chọn hoặc đánh dấu chữ số cuối sau dấu thập phân và thử thay thế bằng một số khác, nó sẽ không hoạt động. – absingharora

Các vấn đề liên quan