JavaScript中带有整数的字符串IndexOf不起作用

5

有人能告诉我为什么这不能用于整数而只适用于字符吗?我真的很讨厌正则表达式,因为它们很难懂,但如果必须使用,我会的。此外,我还想在有效字符中包括“-()”。

String.prototype.Contains = function (str) {  
    return this.indexOf(str) != -1;
};

var validChars = '0123456789';               

var str = $("#textbox1").val().toString();
if (str.Contains(validChars)) {
    alert("found");
} else {
    alert("not found");
}

你尝试过将它转换为字符串吗?(string)intVar 编辑: 在JavaScript中可能不起作用。 - qwerty
1
这个函数只有在你的文本框中包含“0123456789”时才会返回“found”。你到底想做什么? - Cerbrus
如果你想让它适用于整数,你需要添加 Number.prototype.Contains。 - Chris Li
@ChrisLee:str已经被转换为.toString();,所以这不是必要的。 - Cerbrus
如果您想使用这些验证,我建议使用正则表达式而不是contains。 - Ravi Y
对我来说似乎是有效的... http://jsfiddle.net/4VyyA/ - palaѕн
5个回答

4

回顾

String.prototype.Contains = function (str) {  
    return this.indexOf(str) != -1;
};

这个 "method" 方法返回 true 如果 str 在自身中被包含,例如 'hello world'.indexOf('world') != -1将返回true`。

var validChars = '0123456789';               

var str = $("#textbox1").val().toString();
$('#textbox1').val()的值已经是字符串,所以这里不需要使用.toString()
if (str.Contains(validChars)) {
    alert("found");
} else {
    alert("not found");
}

这就是问题所在:实际上,这将执行'1234'.indexOf('0123456789') != -1;它几乎总是会返回false,除非你有一个像10123456789这样的大数字。

你可以对str中的每个字符进行测试,看它们是否包含在'0123456789'中,例如'0123456789'.indexOf(c) != -1,其中cstr中的一个字符。但它其实可以更简单。

解决方法

我知道你不喜欢正则表达式,但在这些情况下它们非常有用:

if ($("#textbox1").val().match(/^[0-9()]+$/)) {
   alert("valid");
} else {
   alert("not valid");
}

解释

[0-9()] 是一个字符类,包括范围为 0-9,即表示 0123456789 的数字和圆括号 ()

[0-9()]+ 匹配至少一个符合上述字符类的字符。

^[0-9()]+$ 匹配所有字符都符合该字符类的字符串;^$ 分别匹配字符串的开头和结尾。

最后,整个表达式两侧用 / 表示正则表达式的定界符。它等价于 new RegExp('^[0-9()]+$')


谢谢,这看起来是最好的解决方案。为什么indexOf不能用于整数,我在Google或任何JavaScript文档中都没有找到任何信息。 - Fab
@Fab 我已经添加了一些解释,为什么你当前的代码无法按预期工作。希望对你有所帮助。 - Ja͢ck

1

您正在将整个validChars列表传递给indexOf()。您需要循环遍历每个字符并逐一检查。

演示

String.prototype.Contains = function (str) {  

  var mychar;
  for(var i=0; i<str.length; i++)
  {
    mychar = this.substr(i, 1);
    if(str.indexOf(mychar) == -1)
    {
        return false;
    }
  }

  return this.length > 0;
};

如果要在整数上使用它,可以使用String()将整数转换为字符串,像这样:

var myint = 33; // define integer
var strTest = String(myint); // convert to string
console.log(strTest.Contains("0123456789")); // validate against chars

@Fab,我的答案中的代码也适用于整数,只需将其从字符串原型中移除即可。您不必使用原型,可以使用相同的代码编写一个函数,该函数接受输入字符串和有效字符字符串作为参数。 - MrCode
谢谢,这实际上就是Ajax控件工具包在FilteredTextBox Extender中所做的。我以为使用indexOf可以使它更有效率,但不明白为什么indexOf只适用于字符串中的字母而不是整数。 - Fab
@Fab,如果你想在一个整数上使用indexOf函数,你可以使用String()函数将其转换为字符串。 - MrCode
我将在contains函数中使用它,这样我就不必记住字符串不能包含整数,但是为了我正在尝试的内容,我将使用正则表达式,因为我基本上正在创建一个插件,可以使用keypress来限制输入仅为有效字符。 - Fab

1

假设您正在寻找一种验证输入的函数,考虑到一个validChars参数:

String.prototype.validate = function (validChars) {  
    var mychar;
    for(var i=0; i < this.length; i++) {
        if(validChars.indexOf(this[i]) == -1) { // Loop through all characters of your string.
            return false; // Return false if the current character is not found in 'validChars' string.
        }
    }
    return true;
};

var validChars = '0123456789';

var str = $("#textbox1").val().toString();
if (str.validate(validChars)) {
    alert("Only valid characters were found! String validates!");
} else {
    alert("Invalid Char found! String doesn't validate.");
}

然而,这是一段相当冗长的代码用于字符串验证。我建议使用正则表达式来代替。(Jack在这里有一个不错的答案


0
感谢大家的回答!看起来我会使用正则表达式。我尝试了所有这些解决方案,但真的想能够传递一个有效字符的字符串,但现在我将传递一个正则表达式。
这适用于单词、字母,但不适用于整数。我想知道为什么它不适用于整数。我希望能够通过在textBox上使用自定义属性来模仿MVC中ajax控件工具包中的FilteredTextBoxExtender。

0
我只是猜测,但看起来你正在尝试检查一个电话号码。改变你的函数的一种简单方法是使用RegExp检查字符串值。
String.prototype.Contains = function(str) {
    var reg = new RegExp("^[" + str +"]+$");
    return reg.test(this);
};

但它不检查字符串中符号的顺序。

检查电话号码更加复杂,因此 RegExp 是一个很好的方法来做到这一点(即使您不喜欢它)。它可以看起来像:

String.prototype.ContainsPhone = function() {
    var reg = new RegExp("^\\([0-9]{3}\\)[0-9]{3}-[0-9]{2}-[0-9]{2}$");
    return reg.test(this);
};

这个变量将检查像"(123)456-78-90"这样的电话号码。它不仅检查字符列表,还检查它们在字符串中的顺序。


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