仅转换字母数字为数字

9

寻找将字母数字混合字符串转换为仅包含数字的快速/高效方法

例如,+123-456/7890 变成 1234567890 等。

现有代码如下:

foreach(char c in str.ToCharArray() )
  if ( char.IsDigit(c) ) stringBuilder.Append(c);

return stringBuilder.ToString();

你实际上想要什么?是新的想法(例如使用正则表达式),还是基准测试?你为什么要问这个问题 - 只是为了了解情况,还是有一个真实世界的场景? - user57508
我不认为你的方法很慢...如果从速度上衡量,应该比正则表达式快得多。我唯一能想到的改进是用Linq替换,但并非出于速度考虑,只是为了更清晰的代码。 - xandy
1
如何在C#中仅获取整数并删除所有字符串? - Imran Rizvi
@ImranRizvi,这不是重复的问题,因为他没有问“如何”,而是问“比这更快”。 - Saeed Amiri
哦,好的,你是对的,检查一下,我已经修改了我的答案。 - Imran Rizvi
5个回答

5
LINQ解决方案:
return new string(str.Where(char.IsDigit).ToArray());

不确定是否更高效;至少它不是正则表达式!


4
string str="+123-456/7890";
long onlyNumbers= Convert.ToInt64(Regex.Replace(str, @"\D", ""));

1
@Kumar:如果你的数字超过了 Int32.MaxValue = 2147483647,请使用 Convert.ToInt64(...);它可以给出高达 Int64.MaxValue = 9223372036854775807 的结果。 - Marshal
@SaeedAmiri,使用正则表达式可能不是最快的方法,但对我来说更易读和舒适。 - Chuck Norris
@SaeedAmiri:在所有给出的答案中,正则表达式是最快的。请查看我的答案以获得解释。 - Marshal
@ChuckNorris:在这里给出的所有答案中,正则表达式是最快的。请查看我的答案以了解详细信息。 - Marshal

2
是的,正则表达式在众多方法中是更快的,你可以使用RegexOptions.Compiled来进行比较,以匹配负/正案例并将它们分开(如果这样的字符串存在)。
例如:
Regex numberOnlyRegEx = new Regex(@"[^0-9]+", RegexOptions.Compiled);

if (!numberOnlyRegEx.IsMatch(str))
  return 0; //default value;

return Convert.ToInt32(numberOnlyRegEx .Replace(str, "[^0-9]+", ""));

我使用Ideone进行了测试,结果完全相反,现在的问题是应该相信VS-IDE还是Ideone? - Marshal
@Marshal 这很奇怪,我更相信 VS-IDE 的结果,因为它在你的本地机器上运行,但不能这么早下定论。 - Imran Rizvi

2

这里有另一种找到的解决方案

string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
int numbers = Convert.ToInt32(justNumbers); 

这个过程比正则表达式比较慢(4毫秒),虽然对应用程序的影响不大(只是一个小的“研究”)。 - Marshal

1

在看到许多回答试图不在这种情况下使用正则表达式之后,我想说实际上在这种特定情况下,正则表达式的速度要快得多。我尝试使用this code snippet计算执行所需的时间。

建议的方法由

  • Imran Rizvi花费了1291个滴答声{{link1:Ideone显示时间:0.06秒,内存:36992 kB}}
  • Chuck Norris花费了1336个滴答声{{link2:Ideone显示时间:0.06秒,内存:37080 kB}}
  • Andy花费了12866个滴答声{{link3:Ideone显示时间:0.04秒,内存:36888 kB}}
  • COLD TOLD花费了18855个滴答声{{link4:时间:0.03秒,内存:36904 kB}}

编辑:这些结果给出了两个完全相反的输出,我不知道我们是否应该完全信任Ideone而不是Visual Studio IDE。


Marshal,请将你的代码放在IDEone上。目前我没有任何东西可以测试,但这个地方对我们双方来说都是可以接受的。 - Saeed Amiri
@SaeedAmiri:好的,我也会尝试找到它 :) - Marshal
编组,只需在ideone.com上键入代码并将其发布,然后在此处留下相关链接即可。 - Saeed Amiri
没什么区别,你能给我看一下你的链接吗?我认为你的测试用例不太好,我们应该稍微改一下。 - Saeed Amiri
请注意,如果您只运行测试一次(正如您的代码片段所示),则可能会看到JIT编译器在这些时间上的影响。 - Andy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接