我有一个输入,我想像货币一样显示。我希望只允许两位小数,并且只允许数字,同时在必要时自动添加逗号。基本上,如果用户键入“12345”,我希望输入自动显示为“12,345.00”。“12,345”也可以接受,但如果他们输入“12345.5”,则需要显示为“12,345.50”。我正在尝试使用管道来完成此操作并决定使用“数字”管道,因为我不希望显示货币符号(我在输入之前已经有一个美元符号作为标签)。
这是我的代码:
<input [ngModel]="Amount | number: '1.2-2'" (ngModelChange)="updateAmount($event)" class="form-control" id="Amount" name="Amount" tabindex="4" type="number" autocomplete="off">
我有几个问题。
- 当我输入一个数字时,它会自动在末尾添加一个小数和两个 0,这很好,但它也会将光标添加到最后,所以如果我输入“55”,而不是显示为“55.00” ,它显示为“5.01”(我假设它将其解释为 5.005,然后将其四舍五入为 5.01)。如何防止光标移动到最后,以便用户可以在看到预期结果的同时自然地键入?
- 此过滤器实际上并未将输入限制为小数点后 2 位。如果我输入“1234”,它将显示为“1.00234”。它还允许我添加多个小数点。如何将其限制为小数点后只有 2 位?
- 输入不正确很容易破坏这个管道。例如,如果用户输入一个字母,我会在控制台中收到一个错误,内容如下:
管道“DecimalPipe”的参数“11.00a”无效
在此错误之后,过滤器完全停止工作。
如果我将输入设置为type="number"
并输入 1234,则值将为 1,234,但输入将消失,我将在控制台中收到以下消息:
指定的值“1,234”不是有效数字。该值必须与以下正则表达式匹配:-?(\d+|\d+.\d+|.\d+)([eE][-+]?\d+)?
使用 JQuery Inputmask 在限制/显示输入方面给了我想要的结果,但它破坏了我的 ngModel 并将值设置为空,所以这不是我的选择,除非有人知道解决方法。
我可以对管道进行更改以获得我想要的结果吗?我怎样才能让它工作?