【问题标题】:Javascript Regex: validating a double/floatJavascript Regex:验证双精度/浮点数
【发布时间】:2013-06-22 08:49:51
【问题描述】:

这是我正在研究的模式:

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

我希望它返回的是一个或两位数(永远不会大于 24,因为它是一个 time mgmt 应用程序),它后面可能跟也可能不跟小数点一个或两个尾随数字,但不超过两个。

我不确定括号中的子字符串匹配是否与前瞻混合。我只是猜测并嵌套了它们。最终,如果我的语法没问题,我认为我唯一缺少的是如何建议该模式可能有也可能没有前导数字,并且可能包含或可能不包含带有试用数字的小数。

如果您需要更多信息,请告诉我。

更新,示例:

我们只处理时间,时间不会超过一天。 24 将是最高输入。

有效:

23.75
1.4 
1
0.5 
0
.2

无效:

1.897
%#$#@$#
Words
other characters

最新更新:

因为这是一个小数,所以 23.75 有效。我们计算的不是分钟,而是几分之一。

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

【问题讨论】:

  • 你能举几个例子来说明你想为特定输入获得的输出吗?你确定分隔符总是. 并且从不说:?如果输入是123.456,您希望发生什么?
  • 我用示例更新了条目。
  • 为什么要使用正则表达式
  • 你想用 12.345 做什么?它是有效的,无效的,你是截断到 12.34 还是四舍五入到 12.35?你怎么能确定这个数字不会大于 24,但它可能是一个字符串?你想对12.89PM做什么? 12,45 怎么样(欧洲人会这样写12.45)

标签: javascript regex validation floating-point


【解决方案1】:

如果“给定的任何数字都将小于 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);
}

注意 - 我对 regex 进行了调整 - 在“小数点后的位”组中添加了 ?:。这仅表示“匹配但不捕获”,因此结果将仅返回匹配 m[0] 而不是 m[1] 中的组 .34。这实际上并不重要,因为我在 m[0] 中分配了 goodTime 的值(但前提是这是一个好时机)。你可以看到这个here

【讨论】:

  • 我将在别处检查空、空、未定义等。一旦字符串被验证并输入为双精度,我还需要做其他检查。我必须玩这个,但我认为这会奏效。 ty
  • 您不要尝试替换 - 只需匹配:var str = "12.34"; var m = str.match(/^\d{0,2}(\.\d{0,2}){0,1}$/);。 m[0] 将包含匹配项 - 如果存在匹配项。否则它将为空。
  • 我已经更新了我的答案,最后用“告诉你就像你什么都不知道一样”......别担心,我们都去过那里。让我知道它现在是否清楚并已解决 - 在这种情况下,您可能会决定“接受”给出的答案之一(带有小复选标记)。
  • 您使用的是我的代码的最新版本(2 小时前更新)-“在您的 Javascript 中测试的简单代码”吗?变量goodTime 应该有正确的答案......两个技巧 - 我稍微改变了表达式(添加了?:)并显式访问m[0] 以获得答案。
  • 不能给这个足够的赞!感谢您的解决方案和酷网站Rubular
【解决方案2】:

这个呢:

([1]?[0-9])|((20)|(21)|(22)|(23)|(24)){0,1}([.][0-9]{0,2})?

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

【讨论】:

  • 请注意 23.75 是有效的 - 我认为 OP 使用的是“十进制时间”而不是 HH:MM
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2018-07-06
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多