Javascript正则表达式:验证双精度/浮点数

4

这是我正在处理的模式:

var re = /(\d{1,2}\.(?=\d{1,2}))/;

我希望返回的是一个一到两位数的数字(由于这是个时间管理应用程序,所以这个数永远不会大于24),它可能跟着一个小数点和一到两位尾数,但不超过两位。
我对包含预查的括号子字符串匹配不确定。我只是猜测并嵌套了它们。如果我的语法没有问题,我认为我唯一缺少的就是如何表达这个模式可能有或没有前导数字,可能有或没有包含带有三位小数的数字。
如果你需要更多信息,请让我知道。
更新, 例子:
我们只处理时间,且时间不超过一天。24 将是最高的输入。
有效:
23.75
1.4 
1
0.5 
0
.2

无效:

1.897
%#$#@$#
Words
other characters

最新更新:

由于这是一个十进制数,23.75可行。我们不计算分钟,而是计算小时的分数。

另外,为了记录,我曾经尝试使用方法和条件进行验证,但在小数点后面会允许字母通过。我已经决定使用正则表达式。


1
你能给出一些特定输入所需的输出示例吗?你确定分隔符始终是 . 而不是 : 吗?如果输入是 123.456,你想要发生什么? - Floris
我已经更新了条目,并添加了示例。 - eightArmCode
1
为什么要使用正则表达式来处理这个? - Anirudha
你想对12.345做什么?它是有效的还是无效的?你会将其截断为12.34还是四舍五入为12.35?你如何确保数字不会大于24,但它可能是一个字符串?你想怎么处理“12.89PM”?那“12,45”呢(这是欧洲人写“12.45”的方式)? - Floris
3个回答

14
如果“给定的任何数字都将小于24”,那么就不需要单独测试它,接下来的表达式就可以起作用。
如果“任何数都小于24”的条件成立,则以下表达式即可使用。
^\d{0,2}(\.\d{0,2}){0,1}$

请查看http://rubular.com/r/YDfHr5T5sQ

测试版本:

23.75             pass
1.4               pass
1                 pass
0.5               pass
0                 pass
.2                pass
1.897             fail
%#$#@$#           fail
Words             fail
other characters  fail

解释:

^             start matching at the start of the string
\d{0,2}       look for zero to two digits
(   ){0,1}$   look for this next thing zero or one time, then the end of the string
\.\d{0,2}     match exactly one decimal followed by up to two digits
注意 - 这个正则表达式确实可以匹配“空字符串”。如果有可能会匹配到空字符串,请单独测试一下,以确保其不会对这个表达式造成影响...
在你的 JavaScript 中测试的简单代码:
var str = "12.345";
var m = str.match(/^\d{0,2}(?:\.\d{0,2}){0,1}$/);
var goodTime;
if (!m) {
    alert(str + " is not a good time");
}
else {
    goodTime = m[0];
    alert("found a good time: " + goodTime);
}

注意 - 我对正则表达式进行了微调 - 在小数部分后面的组中添加了?:。这意味着“匹配但不捕获”,因此结果将仅返回匹配项m[0],而不是m[1]中的组.34。实际上并不重要,因为我只在它是好时间时才给goodTime赋值m[0]的值。您可以在这里看到其实现。


我会在其他地方检查空、null、undefined等情况。一旦字符串经过验证并转换为双精度类型,我还需要进行其他检查。我需要再测试一下,但我认为这会起作用。谢谢。 - eightArmCode
1
不要试图替换 - 只需匹配:var str = "12.34"; var m = str.match(/^\d{0,2}(\.\d{0,2}){0,1}$/);。如果存在匹配,则 m[0] 将包含该匹配。否则它将为空。 - Floris
1
我在答案末尾添加了一个“像你什么都不知道一样告诉你”的部分……别担心,我们都曾经历过这种情况。如果现在已经清楚并解决了问题,请让我知道——这种情况下,您可能会决定“接受”其中一个答案(带有小复选框)。 - Floris
1
你正在使用我最新的代码版本(2小时前更新)-“用于在JavaScript中测试的简单代码”吗?变量goodTime应该只包含正确的答案... 两个技巧-我稍微改变了表达式(添加了?:),并明确访问m [0]以获取答案。 - Floris
1
无法赞同这个解决方案和酷站Rubular,太感谢了! - Pierre
显示剩余3条评论

0

你可以尝试这个正则表达式

^(?![3-9]\d|[2][5-9]|24[.])\d{1,2}([.]\d{1,2})?$

但是在这里你不需要使用正则表达式,只需将字符串解析为数字并检查是否小于或等于24


0
这一个怎么样?
([1]?[0-9])|((20)|(21)|(22)|(23)|(24)){0,1}([.][0-9]{0,2})?

编辑:我建议您在正则表达式中仅进行简单的检查,并在其他地方测试语义正确性(例如小于24),因为它会变得非常复杂。时间也不允许23:74,但允许23:59...


请注意,23.75 是有效的 - 我认为 OP 使用的是 "十进制时间" 而不是 HH:MM - Floris

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