Javascript IndexOf,字符串中的整数不起作用

时间:2012-12-18 07:55:35

标签: javascript jquery

任何人都可以告诉我为什么这不适用于整数而是适用于角色?我真的很讨厌reg表达,因为它们很神秘,但如果我也有。另外,我想在有效字符中加入“ - ()”。

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");
}

5 个答案:

答案 0 :(得分:4)

查看

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

如果str包含在其中,则此字符串“方法”返回true,例如'hello world'.indexOf('world')!= -1 would return 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()]+$')的缩写。

答案 1 :(得分:1)

您正在将validChars的完整列表传递给indexOf()。您需要遍历字符并逐个检查它们。

<强> Demo

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

答案 2 :(得分:0)

假设您正在寻找验证输入的功能,请考虑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.");
}

然而,这是字符串验证的大量代码。我建议考虑使用正则表达式。 (杰克有一个nice answer up here

答案 3 :(得分: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"等手机。它不仅检查字符列表,还检查字符串中的序列。

答案 4 :(得分:0)

谢谢大家的回答!看起来我会使用正则表达式。我已经尝试了所有这些解决方案,但我真的希望能够传递一串validChars,但我会传入一个正则表达式。

这适用于单词,字母,但不适用于整数。我想知道为什么它对整数不起作用。我希望能够通过在textBox上使用自定义属性,从MVC中的ajax控件工具包模仿FilteredTextBoxExtender