【问题标题】:Make only two decimal after point (Angular)点后仅保留两位小数(角度)
【发布时间】:2019-05-13 10:15:02
【问题描述】:

我有一个文本输入指令,它替换文本符号并只允许输入十进制数字。

这是该指令的代码

import { NgControl } from '@angular/forms';
import { HostListener, Directive } from '@angular/core';

@Directive({
    exportAs: 'decimal-number-directive',
    selector: 'decimal-number-directive, [decimal-number-directive]'
})
export class DecimalNumberDirective {
    private el: NgControl;
    constructor(ngControl: NgControl) {
        this.el = ngControl;
    }
    // Listen for the input event to also handle copy and paste.
    @HostListener('input', ['$event.target.value'])
    onInput(value: string) {
        // Use NgControl patchValue to prevent the issue on validation
        this.el.control.patchValue(value.replace(/[^0-9].[^0-9]/, ''));
    }
}

现在我可以写 n 个十进制符号了。我只需要两个。我该怎么做?

【问题讨论】:

  • 您可以编辑您的问题并向我们展示所有允许的输入吗?
  • 尝试像这样指定一个量词:/[0-9]+.[0-9]{0,2}/
  • 您使用了不匹配数字的否定字符类[^。试试[0-9]+\.[0-9]{2}

标签: javascript regex angular typescript


【解决方案1】:

所以为了显示小数位并且不允许符号我需要写这样的指令

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

@Directive({
    exportAs: 'decimal-number-directive',
    selector: 'decimal-number-directive, [decimal-number-directive]',
})
export class DecimalNumberDirective {
    private regex: RegExp = new RegExp(/^\d*\.?\d{0,2}$/g);
    private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home', '-'];
    constructor(private el: ElementRef) {}
    @HostListener('keydown', ['$event'])
    onKeyDown(event: KeyboardEvent) {
        console.log(this.el.nativeElement.value);
        // Allow Backspace, tab, end, and home keys
        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();
        }
    }
}

【讨论】:

  • 您使用的模式也匹配一个空字符串、一个点或仅一个数字。见regex101.com/r/rj4G4X/1。我还使用match 的示例更新了我的答案,并使用test 离开了示例。
【解决方案2】:

在您的模式[^0-9].[^0-9] 中,您将 3 个字符替换为空字符串。您不匹配数字,除了使用点的换行符和使用negated character class [^ 的数字之外的任何字符。

如果您想删除除数字和点之外的所有字符,您仍然不确定格式是否正确,因为 ... 也可能有效。

尝试匹配一个点后有 2 个小数的值,而不是替换。

^[0-9]+\.[0-9]{2}$

如果您允许以点开头,您可以使用* 代替+

^[0-9]*\.[0-9]{2}$

使用test的示例:

let pattern = /^[0-9]+\.[0-9]{2}$/;
["2.22", "....", "1", "3.299"].forEach(s => console.log(s + ": " + pattern.test(s)));

或者使用match:

let pattern = /^[0-9]+\.[0-9]{2}$/;
["2.22", "....", "1", "3.299"].forEach(s => {
  let res = s.match(pattern);
  console.log((null === res ? "No match: " : "Match: ") + s)
});

【讨论】:

  • 是的。但不是{2},我需要{3} 如果我写22.34 没关系,如果22.343 它将删除整个值。我不想要这个
  • @EugeneSukh 您可以尝试匹配它而不是删除,因为如果您删除除数字和点之外的所有内容,那么..... 也将有效。
  • 你的正则表达式没有替换文本符号
  • 在这种情况下,您可以使用 test 来测试格式是否为带 2 位小数的数字,而不是使用替换。
  • 我觉得 Typescript 没有这个东西
猜你喜欢
  • 2010-11-20
  • 2020-09-11
  • 2011-06-14
  • 2022-12-07
  • 2022-10-12
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多