5

谁能告诉我为什么这不适用于整数但适用于字符?我真的很讨厌 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");
}
4

5 回答 5

4

审查

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

如果包含在其自身中,则此字符串“方法”返回 true str,例如 'hello world'.indexOf('world') != -1 would returntrue`。

var validChars = '0123456789';               

var str = $("#textbox1").val().toString();

的值$('#textbox1').val()已经是一个字符串,所以.toString()这里不需要。

if (str.Contains(validChars)) {
    alert("found");
} else {
    alert("not found");
}

这就是问题所在;有效地执行'1234'.indexOf('0123456789') != -1false除非你有一个巨大的数字,否则它几乎总是会返回10123456789

您可以做的是测试每个字符是否str包含在其中'0123456789',例如. 不过,它可以做得更容易。'0123456789'.indexOf(c) != -1cstr

解决方案

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

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()]+$')

于 2012-12-18T08:05:18.633 回答
1

validChars您正在传递to的整个列表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
于 2012-12-18T08:02:07.140 回答
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.");
}

但是,这对于字符串验证来说是相当多的代码负载。我建议改为研究正则表达式。(杰克在这里有一个很好的答案

于 2012-12-18T08:09:32.107 回答
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". 它不仅检查字符列表,还检查它们在字符串中的顺序。

于 2012-12-18T08:22:38.530 回答
0

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

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

于 2012-12-18T16:03:49.967 回答