从 C# 中的字符串中提取数字
本文关键字:提取 数字 字符串 | 更新日期: 2023-09-27 18:17:48
我正在为手机对象编写一个 json 反序列化程序。
其中一个属性是电话号码。在我的数据库中,我将数字存储为一串数字。
我有一个名为 IncomingClientJsonPhoneCandidate
的字符串,我正在编写一个循环,该循环遍历字符串的每个字符,并在字符传递字节时将值添加到字符串生成器中。尝试解析。
我想知道是否有更好的方法来做到这一点。感谢您的建议。
你可以
试试
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?