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

本文关键字:提取 数字 字符串 | 更新日期: 2023-09-27 18:17:48

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

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

我有一个名为 IncomingClientJsonPhoneCandidate 的字符串,我正在编写一个循环,该循环遍历字符串的每个字符,并在字符传递字节时将值添加到字符串生成器中。尝试解析。

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

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

你可以

试试

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());
}
char.IsDigit()

(这就是你真正需要的,但我必须在这里放更多字符限制(

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

使用正则表达式

Int32.TryParse("13231321"( 将为您节省循环的需要

为什么不使用现有的反序列化程序。净网还是 Json.net?