从c#中的字符串中提取数字

时间:2011-12-14 21:18:15

标签: c#

我正在为手机对象编写一个json反序列化器。

其中一个属性是电话号码。在我的数据库中,我将数字存储为一串数字。

我有一个名为IncomingClientJsonPhoneCandidate的字符串,我正在编写一个遍历字符串每个字符的循环,并在字符传递byte.TryParse时将值添加到字符串构建器。

我想知道是否有更好的方法来做到这一点。 谢谢你的建议。

5 个答案:

答案 0 :(得分:5)

你可以尝试

string ExtractNumericCharacters(string s)
{
    return string.IsNullOrEmpty(s) ? s : new string(s.Where(c => char.IsDigit(c)).ToArray());
}

您还可以使用方法组转换而不是lambda:

string ExtractNumericCharacters(string s)
{
    return string.IsNullOrEmpty(s) ? s : new string(s.Where(char.IsDigit).ToArray());
}

修改

要了解为什么你不能在这里使用ToString(),让我们分开复杂的表达式:

string ExtractNumericCharacters(string s)
{
    if (string.IsNullOrEmpty(s))
        return s;

    IEnumerable<char> numericChars = s.Where(char.IsDigit);

    // numericChars is a Linq iterator; if you call ToString() on this object, you'll get the type name.
    // there's no string constructor or StringBuilder Append overload that takes an IEnumerable<char>
    // so we need to get a char[].  The ToArray() method iterates over the WhereEnumerator, copying
    // the sequence into a new array; this is functionally equivalent to using a foreach loop with an if statement.

    char[] numericCharArray = numericChars.ToArray();

    // now we can make a string!

    return new string(numericCharArray);
}

如果您想坚持使用StringBuilder的原始方法,可以将char[]传递给StringBuilder的Append方法,而不是调用new string(...

编辑2

除了添加上面关于循环的一些细节之外,感谢McKay的评论,我想到我可以添加查询理解语法。这是我通常更喜欢扩展方法语法的一个很好的例子;在这种情况下,扩展方法更简洁:

string ExtractNumericCharacters(string s)
{
    return string.IsNullOrEmpty(s) ? s : new string((from c in s where char.IsDigit(c) select c).ToArray());
}

答案 1 :(得分:0)

char.IsDigit()

(这就是你真正需要的,但我必须在这里加入更多的角色限制)

答案 2 :(得分:0)

 public static string GetNumberFromStrFaster(string str)
    {
      str = str.Trim();
      Match m = new Regex(@"^[\+\-]?\d*\.?[Ee]?[\+\-]?\d*$",         
      RegexOptions.Compiled).Match(str);
      return (m.Value);
    }

使用正则表达式

答案 3 :(得分:0)

Int32.TryParse(“13231321”)将节省您对循环的需求

答案 4 :(得分:0)

为什么不使用现有的反序列化器.NET或Json.net