【发布时间】:2017-05-19 08:30:19
【问题描述】:
假设我们将以下字符串作为参数传递给下面的函数:
string sString = "S104";
string sString2 = "AS105";
string sString3 = "ASRVT106";
我希望能够从string 中提取数字并将它们放入int 变量中。有没有比下面的代码更快和/或更有效的方法从字符串中删除字母?:(*这些字符串将在运行时动态填充 - 它们在构造时没有被赋值。)
代码:
public GetID(string sCustomTag = null)
{
m_sCustomTag = sCustomTag;
try {
m_lID = Convert.ToInt32(m_sCustomTag); }
catch{
try{
int iSubIndex = 0;
char[] subString = sCustomTag.ToCharArray();
//ITERATE THROUGH THE CHAR ARRAY
for (int i = 0; i < subString.Count(); i++)
{
for (int j = 0; j < 10; j++)
{
if (subString[i] == j)
{
iSubIndex = i;
goto createID;
}
}
}
createID: m_lID = Convert.ToInt32(m_sCustomTag.Substring(iSubIndex));
}
//IF NONE OF THAT WORKS...
catch(Exception e)
{
m_lID = 00000;
throw e;
}
}
}
}
我以前做过这样的事情,但我不确定是否有更有效的方法来做到这一点。如果开头只是一个字母,我可以每次都将subStringIndex 设置为 1,但用户基本上可以输入任何他们想要的内容。通常,它们将被格式化为 LETTER-then-NUMBER 格式,但如果他们不这样做,或者他们想输入多个字母,例如 sString2 或 sString3,那么我需要能够弥补这一点。此外,如果用户输入一些像string sString 4 = S51A24; 这样的破旧的非传统格式,有没有办法从字符串中删除所有字母?
我四处寻找,在 MSDN 或 Google 上找不到任何东西。非常感谢任何帮助或链接!
【问题讨论】:
-
你为什么在代码中使用
goto只是好奇 -
使用正则表达式......
-
我使用它而不是
break,因为它在嵌套的 for 循环中,我想要一个数字的第一个实例。我觉得break会找到第一个数字,然后继续遍历char[]的其余部分,这是我不想要的,因为我不希望iSubIndex被重新分配。 -
@GeoffOverfield
google.. 是什么?互联网上也有很多关于如何从字符串中提取数字的例子,这里有 1 个 stackoverflow.com/questions/4734116/… -
这里有一个解决方案... http://stackoverflow.com/a/273144/3877877 .... 简而言之
Regex.Replace(input, @"[^\d+$]", "");
标签: c# string data-manipulation