2017-11-11 68 views
0

下面我有一段代码能够从一段文本中提取数字值。所以,如果我有串+12 is on same day,那么它会提取12如何从文本中提取负号符号

但是,如果我有一个像-12 is on the same day,负数我想它来提取-12,而不是12

我怎样才能提取减号?

foreach (char c in alternativeAirportPrice.Text) 
{ 
    if (char.IsNumber(c)) 
    {      
     string test = "-12 on same day"; 
     string alternativeAirportPriceValue = string.Join("", test.ToCharArray() 
              .Where(x => char.IsDigit(x)).ToArray()); 
     return alternativeAirportPriceValue; 
    } 
} 
+1

代码不是很稳定。想想“9是新的11”,它会返回“911” –

+1

这是一个好点;你知道文本中总是只有一个数字吗? – d219

+1

@SirRufo我认为这是一个很好的功能,当危险的代码弹出正确的号码呼叫。 –

回答

2

这应该是你想要根据问题的预期结果。请注意,您不需要foreach循环用于此目的只是LINQ是不够的:

string.Join("", test.Split(' ').Where(x => int.TryParse(x , out _)).ToArray()); 
return alternativeAirportPriceValue; 
5

您可以使用正则表达式模式:

-?\d+ 

这将匹配数字的任何字符串或-其次由一串数字组成。

string text = "-12 on the same day"; 
var match = Regex.Match(text, "-?\\d+"); 
return match.Value; 

请记得在System.Text.RegularExpressions上添加使用指令!

+0

我喜欢那样。正如Rufo先生在上面所说的那样,尽管它取决于原始的海报是否知道只有一个号码存在,因为这将返回第一个号码 – d219

0

试试这个:

public IEnumerable<int> ExtractNumbers(string text) 
{ 
    text += " "; 
    var temp = string.Empty; 
    for (var i = 0; i < text.Length; i++) 
    { 
     if (char.IsDigit(text[i])) 
     { 
      if ('-'.Equals(text[i - 1])) 
      { 
       temp += text[i - 1]; 
      } 
      temp += text[i]; 
     } 
     else if (temp.Length > 0) 
     { 
      yield return int.Parse(temp); 
      temp = string.Empty; 
     } 
    } 
} 

这样你就可以处理的情况下字符串中有多个号码,通过@Sir入佛​​门观察到

行:

text += " "; 

是在数字处于字符串的最后位置时,确保循环将命中“else if”块,例如“-12在同一天123456”