【问题标题】:Regex for small decimal with 8 digits after decimal小数点正则表达式,小数点后 8 位
【发布时间】:2018-07-16 00:02:28
【问题描述】:

我在使用需要允许正数或负数以及最多 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;
 }
}

【问题讨论】:

标签: javascript regex angular


【解决方案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

如果您仍然有输入验证问题,您可能还有其他问题,例如输入未修剪...从正则表达式的角度来看,这很好。

【讨论】:

  • 对不起,我在玩这个时复制并粘贴了 9 位数字。看起来当我使用一个小数字时,如果我对我的值执行 console.log(),它就会变成“1e-8”。我想知道这是否是我进行正则表达式测试时正在查看的值。我不确定如何在 Angular/Typescript 中阻止这种情况发生
【解决方案2】:

试试这个正则表达式:

^[+-]?\d*\.\d{1,8}$

Click for Demo

说明:

  • ^ - 断言行首
  • [+-]? - 匹配 +-,可选
  • \d* - 匹配 0+ 个数字。这表示小数部分之前的数字。
  • \. - 匹配小数点 .
  • \d{1,8} - 匹配最少 1 位,最多 8 位
  • $ - 断言行尾

【讨论】:

  • 不错+1!比他现在的要容易得多;-)
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2022-07-22
相关资源
最近更新 更多