如何从字符串中获取第一个数字?
示例:我有“1567438absdg345”
我只想获取“1567438”,不包括“absdg345”,我希望它是动态的,获取字母索引的第一次出现并删除其后的所有内容。
示例:我有“1567438absdg345”
我只想获取“1567438”,不包括“absdg345”,我希望它是动态的,获取字母索引的第一次出现并删除其后的所有内容。
TakeWhile
扩展方法从字符串中获取数字字符:string input = "1567438absdg345";
string digits = new String(input.TakeWhile(Char.IsDigit).ToArray());
string digits = new String(input.SkipWhile(c => !Char.IsDigit(c)).TakeWhile(Char.IsDigit).ToArray());
- GuffaLINQ方法:
string input = "1567438absdg345";
string output = new string(input.TakeWhile(char.IsDigit).ToArray());
或者使用正则表达式方法
String s = "1567438absdg345";
String result = Regex.Match(s, @"^\d+").ToString();
^
匹配字符串的开头,\d+
匹配后面的数字。
Char.isDigit
测试当前字符是否为数字。string str = "1567438absdg345";
string result = "";
for (int i = 0; i < str.Length; i++) // loop over the complete input
{
if (Char.IsDigit(str[i])) //check if the current char is digit
result += str[i];
else
break; //Stop the loop after the first character
}
string input = "1567438absdg345";
string result = "";
foreach(char c in input)
{
if(!Char.IsDigit(c))
{
break;
}
result += c;
}
private int GetFirstNum(string inp)
{
string final = "0"; //if there's nothing, it'll return 0
foreach (char c in inp) //loop the string
{
try
{
Convert.ToInt32(c.ToString()); //if it can convert
final += c.ToString(); //add to final string
}
catch (FormatException) //if NaN
{
break; //break out of loop
}
}
return Convert.ToInt32(final); //return the int
}
测试:
Response.Write(GetFirstNum("1567438absdg345") + "<br/>");
Response.Write(GetFirstNum("a1567438absdg345") + "<br/>");
结果:
1567438
0
一种老派的正则表达式方式:
public long ParseInt(string str)
{
long val = 0;
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"^([\d]+).*$");
System.Text.RegularExpressions.Match match = reg.Match(str);
if (match != null) long.TryParse(match.Groups[1].Value, out val);
return val;
}
string val = "1567438absdg345";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[1-9][0-9]*");
string valNum = reg.Match(val).Value;
string stringResult = "";
bool digitFound = false;
foreach (var res in stringToTest)
{
if (digitFound && !Char.IsDigit(res))
break;
if (Char.IsDigit(res))
{
stringResult += res;
digitFound = true;
}
}
int? firstDigitInString = digitFound ? Convert.ToInt32(stringResult) : (int?)null;
string[] numbers = Regex.Split(input, @"\D+");
string[] numbers = Regex.Split(firstResult, @"\D+").Where(x => x != "").ToArray();
我知道这个问题已经有10年了,但以防其他人遇到它。如果数字恰好在输入字符串的开头,接受的答案只会给出第一个数字。
当您的字符串以除数字以外的任何内容开头时,它会返回空字符串。 在使用接受的答案之前,您需要先知道第一个数字的索引并执行一个子字符串。
string input = "abc123def456ghi";
string digits = null;
if (!string.IsNullOrEmpty(input))
{
var indexFirstDigit = input.IndexOfAny("0123456789".ToCharArray());
if (indexFirstDigit >= 0)
{
digits = new String(input.Substring(indexFirstDigit).TakeWhile(Char.IsDigit).ToArray());
}
}
尽管使用正则表达式可以减少代码行数
string input = "abc012def345ghi";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[\\d]+");
string digits = reg.Match(input).Value;