强制保留小数点后两位的正则表达式

5

我需要用JavaScript验证数字字符串,以确保数字恰好有两位小数。

只有在以下情况下,验证才会通过:

  1. 该数字恰好有两位小数
  2. 小数点前至少有一个数字。(可以为零)
  3. 小数点前的数字不能以多于一个零开头。

有效数字:

0.01
0.12
111.23
1234.56
012345.67
123.00
0.00

无效的数字:

.12
1.1
0.0
00.00
1234.
1234.567
1234
00123.45
abcd.12
12a4.56
1234.5A

我尝试使用正则表达式[0-9][\.][0-9][0-9]$,但它允许小数点前有字母,比如12a4.56

7个回答

8

. 匹配任何字符,它并不是你想象的那样。你需要对它进行转义。另外,你还有两个错误;请尝试。

^[0-9]+\.[0-9][0-9]$

相反,或者更好的选择是使用\d 表示十进制数字:

^\d+\.\d\d$

@ManasSaha 噢,所以你想要小数点前至少有一个数字。这是给你的。 - user529758
一个包含点的字符类匹配一个字面上的点,而不是任何字符。真正的问题在于,OP没有强制要求数字紧随开头后面,即没有使用 ^,同时他也不允许小数点前有多个数字。[.] 是完全可以的。 - phant0m
他提供了正则表达式:[0-9][.][0-9][0-9]$ ;) 此外,你也可以使用\d代替[0-9] - phant0m
我并不是说这是一个糟糕的答案,我只是假设你看到了OP提供的正则表达式。评论的目的在于指出错误(当然还有其他方面),这就是我想要做的。 - phant0m
在当前问题中,有我提供的正则表达式,它就在代码部分下面,但不在反引号内,因此不太显眼 ;) - phant0m
显示剩余5条评论

7

这个表达式涵盖了所有的要求

^(0|0?[1-9]\d*)\.\d\d$
  • 这个数字恰好有两位小数
    • 由于不可选的\.\d\d$,很容易满足

另外两个条件可以重新表述如下:

  • 小数点前的数字要么是零,
  • 要么是一个零接着一个不以零开头的数字

这在以下两种情况下都成立:

  • 0
  • 0?[1-9]\d*

问候!第二个零的目的是什么?是用于八进制吗?如果使用(0|[1-9][0-9]*)而不是(0|0?[1-9][0-9]*)会怎样? - undefined
1
@Artfaith 这正是OP在他们的“有效数字”示例中所要求的,012345.67 - undefined

4
你不需要使用正则表达式来完成这个任务。
JavaScript有一个函数toFixed(),可以满足你的需求。
var fixedtotwodecimals = floatvalue.toFixed(2);

我认为OP想要验证用户输入(即布尔值),而不是在其无效时进行更正/修复。 - user529758
1
是的...所以将原始值与toFixed值进行比较。你仍然不需要正则表达式。 - Spudley

2

我用过这个正则表达式:

^[1-9][1-9]*[.]?[1-9]{0,2}$

  • 0 不被接受。

  • 123.12 被接受,但 123.123 不被接受。

  • 1 被接受。

  • 12213123 被接受。

  • sdfsf 不被接受。

  • 15.12 被接受。

  • 15@12 不被接受。

  • 15&12 不被接受。


此代码不接受320或1.10,您可以更改为^[1-9][0-9]*[.]?[0-9]{0,2}$。 - Virako

1
var values='0.12';

document.write(values.match(/\d+[.]+\d+\d/));

根据您的需求更改值并进行检查


0

尝试这段代码

pattern="[0-9]*(\.?[0-9]{1,2}$)?"
  • 1 有效

  • 1.1 有效

  • 1.12 有效

  • 1.123 不合法

  • 只允许数字,有效

    模式="[0-9]*(.?[0-9]{2}$)?"

  • 1 有效

  • 1.1 不合法

  • 1.12 有效

  • 1.123 不合法

  • 只允许数字,有效


0

这是它:

^(0[.]+\d{2})|^[1-9]\d+[.]+\d{2}$

这是错误的,它匹配了0.110.11。你缺少括号,|后面的^是错误的,[.]+不应该有一个+ - phant0m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接