【问题标题】:Integer validation not working as expected整数验证未按预期工作
【发布时间】:2012-09-28 04:57:59
【问题描述】:

感谢本网站上的一些答案,我构建了一个函数来验证 javascript 提示中的整数。我发现了如何使用isNaN% 的结果来满足我的需求,但肯定有问题,因为仍然无法正常工作:这个验证函数只需要接受整数,作为额外奖励,它还将接受稍后在程序中用于不同目的的特殊关键字。

所以,之前我已经定义了:

var value = prompt("Type an integer");

然后,我调用了验证函数,其中包括三个条件:验证警告会在以下情况下跳转:

1) 字符串不是数字

2) 字符串 %1 不为 0(表示不是整数)

3)字符串不是特殊关键字(“extra”),也可以作为输入。

函数需要循环并不断显示提示,直到写入有效数据。

while (isNaN(value) == true && value % 1 != 0 && value != "extra") {
    alert("Please, type an integer");
    var value = prompt("Type an integer");
}

我做错了什么?非常感谢您的任何想法。我知道整数验证已经被问过很多次了,在这里我得到了一些想法,但我可能会遗漏一些东西......

【问题讨论】:

  • =是赋值运算符,相等比较运算符是==
  • 非常正确,我很傻......但经过更正后,仍然无法正常工作

标签: javascript validation integer


【解决方案1】:

您可能把事情复杂化了...快速的regular expression 就可以解决问题。

while (!/^(\d+|extra)$/i.test(value)) {
  ...
}

【讨论】:

  • 可能想多了,我不确定问题是针对@elclanrs 还是针对操作员,但是value = "0x04" 之类的会发生什么?跨度>
  • 感谢您的提示!我在这方面非常新手,在摆弄了一下php之后才开始使用javascript,并且不知道正则表达式......
  • 不,我知道,但它一个(十六进制)整数。很可能他不想接受除以 10 为底的数字以外的任何数字,在这种情况下,您的解决方案简单明了,并且可能比沿着原始路径更好。但如果有理由允许使用十六进制等,那么正则表达式方法将无法正常工作。
  • 实际上,我猜除了十进制或十六进制之外唯一的可能性是八进制,例如064,fwiw。
  • 哦,我明白你的意思了,是的,不知道 OP 的需求,但对于八进制的情况,你可以防止零,我猜 ^[^0](\d+|extra)$
【解决方案2】:

jsFiddle 示例

    var int = 10;
var str = "10";

var isInt = function(value) {
    return (str === 'extra' || !isNaN(parseInt(value, 16)) || /^\d+$/.test(value));
};

var isIntStrict = function(value) {
    return (isInt(value) && typeof value !== 'string');
}

console.log('false', isInt('kirk'));
console.log('true', isInt(int));
console.log('true', isInt(str));
console.log('true', 'strict - int', isIntStrict(int));
console.log('false','strict - string', isIntStrict(str));
console.log('false','strict - string', isIntStrict('0x04'));
console.log('true','strict - string', isIntStrict(0x04));

【讨论】:

  • 感谢您的所有想法。尽管我的目的要简单得多,但我从你们所有的 cmets 中学到了很多东西。
【解决方案3】:

您只输入了一个相等的 at

isNaN(value) = true

【讨论】:

  • 谢谢!完全正确...但是,这仍然不是主要问题。在纠正了那个愚蠢的错误之后,例如,如果我输入了数字 2(应该是有效的),它会检测到它是无效的并提示我再次输入它......
  • @A.MatíasQuezada 它似乎工作得有点太好了,例如'3.4' 似乎通过了测试。 ;)
  • 大声笑,没错,我认为最好使用@elclanrs 写的正则表达式。
【解决方案4】:

我假设出于您的目的,@elclanrs 的答案就是您所需要的,并且是最简单和最直接的,但只是为了完整性和可疑的笑声,我很确定以下内容也可以满足您的需求寻找:

function isAnIntOrExtra(v) {
  if (parseInt(+v) === +v && v !== '') {
    return parseInt(+v);
  }
  else if (v === 'extra') {
    return v;
  }
  else {
    return false;
  }
}

Fiddle here

这些都应该以十进制形式传递并返回一个整数:

  • '387' 返回387
  • '-4' 返回-4
  • '0' 返回0
  • '2.4e3' 返回2400
  • '0xf4' 返回244

虽然这些都应该失败:

  • '4.5' 返回false
  • '2.4e-3' 返回false
  • '0xgc' 返回false
  • '' 返回false
  • “七”返回false

魔术词“额外”返回'extra'

当然,对于像 '1,345' 这样的值,它会“失败”得很惨,并且可能会直接翻转八进制表示法,将其视为十进制表示法(取决于 JavaScript 引擎?),但它 也可以调整以处理这些情况,但实际上,你最好使用正则表达式。

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2021-09-21
    相关资源
    最近更新 更多