我在使用十进制正则表达式时遇到问题需要允许正数或负数以及最多8位小数。
这就是我所拥有的。
^-?(?:(?:0|[1-9][0-9]*)(?:\.[0-9]{1,9})?|\.[0-9]{1,9})$
在大多数情况下,这有效,但它不会验证.00000001
,我无法弄清楚原因。它似乎不适用于我连续超过6个零的任何小数。
export class AmountValidateDirective implements Validator {
validate(c: FormControl): any {
let amount = c.value;
const isValid = /^-?(?:(?:0|[1-9][0-9]*)(?:\.[0-9]{1,9})?|\.[0-9]{1,9})$/.test(amount);
const message = {
'amountValidate': {
'message': 'Must be Decimal with less than 8 digits'
}
};
return isValid ? null : message;
}
}
答案 0 :(得分:2)
试试这个正则表达式:
^[+-]?\d*\.\d{1,8}$
<强> Click for Demo 强>
<强>解释强>
^
- 断言行的开头[+-]?
- 匹配+
或-
,可选\d*
- 匹配0位以上的数字。这表示小数部分之前的数字。\.
- 匹配小数点.
\d{1,8}
- 匹配最少1位数,最多8位数$
- 断言行尾答案 1 :(得分:1)
首先,您当前的正则表达式最多可接受9位小数。 我已将其调整为在点后最多8位数。
^-?(?:(?:0|[1-9][0-9]*)(?:.[0-9]{1,8})?|.[0-9]{1,8})$
^ ^
^ ^
我在这里测试过,你可以看到匹配列表: https://regex101.com/r/SQYgq9/1/
1
1234
1234.1234
123456.123456
1234567.1234657
12345678.12345678
12345678.1243546788 <NOT MATCHED
.91
0.12
.00001
.000001
.00000001
.000000001 <NOT MATCHED
.000000000 <NOT MATCHED
.0000000001 <NOT MATCHED
-1
-1234
-1234.1234
-123456.123456
-1234567.1234657
-12345678.12345678
-12345678.1243546788 <NOT MATCHED
-.91
-0.12
-.00001
-.000001
-.00000001
-.000000001 <NOT MATCHED
-.0000000001 <NOT MATCHED
如果您仍然遇到输入验证问题,您可能还有其他问题,例如输入未修剪...例如,从正则表达式的角度看它很好。