2012-08-29 171 views
2

我只需要讀取完整字符串的特定部分。該字符串的形式:String.Split()返回空值

「1某些貨幣名稱= 0.4232其它貨幣名稱」

所以,我能想出的最快捷的方法是字符串在等號(=)算子分裂從而增加兩個值到數組中,像這樣:

string rawInput = "1 Some Currency Name = 0.4232 Other Currency Name"; 
string[] rawSplit = rawInput.Split('='); 
string firstRate = rawSplit[0].ToString(); 
string secondRate = rawSplit[1].ToString(); 

我現在需要只得到secondRate串的第一部分(「0.4232」)。所以,我想再次拆分字符串(壞的編碼):

string[] lastSplit = secondRate.Split(); //Split at whitespace characters 
string firstValue = lastSplit[0].ToString(); //Should return "0.4232" but instead returns "" 

當我運行的應用程序來測試這個功能,它返回一個空字符串,而不是值「0.4232」。這是爲什麼發生?我在這裏錯過了什麼?

完成方法:

private void btnTest_Click(object sender, EventArgs e) 
{ 
    string rawInput = "1 Some Currency Name = 0.4232 Other Currency Name"; 
    string[] rawSplit = rawInput.Split('='); 
    string baseRate = rawSplit[0].ToString(); //1 Some Currency Name 
    string conversionRate = rawSplit[1].ToString(); //0.4232 Other Currency Name 

    rawSplit = GetSplit(conversionRate); 
    XtraMessageBox.Show(rawSplit[0].ToString()); //Returns blank string here??? 
} 

private string[] GetSplit(string inputString) 
{ 
    return inputString.Split(); 
} 

任何意見或建議,歡迎和將不勝感激!

+0

如果拆分在'=',則字符串將是'0.4232 ......這意味着第一個條目是emp ty當用空格分割時。 – pstrjds

+1

出於興趣,你爲什麼在已經是字符串的值上調用'ToString()'? –

回答

11

的問題是,當你在'='分割你的原始字符串,你得到的結果與年初的結果的額外的空間,基本上rawSplit[1]等於" 0.4232 Other Currency Name"

您可以使用String.Split的超載,允許您指定刪除空條目,這將刪除結果中的空白條目。

string[] lastSplit = secondRate.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); 

在一個側面說明,沒有必要使用ToString()當輸入已經是一個字符串:

string[] rawSplit = rawInput.Split('='); 
// rawSplit is a string array, so rawSplit[0] is already a string... 
string firstRate = rawSplit[0]; // .ToString(); 
+0

謝謝!它像一個魅力。 – Juan

0

下面會返回字符串「0.4232其它貨幣名稱」

string conversionRate = rawSplit[1].ToString(); 

之前它有一個空間,所以當再次分裂時:

return inputString.Split(); 

陣列中的0位置是該空間,您可能需要位置1或在最終分割之前進行修剪。

0

字符串的第二部分是= 0.4232,在=和0.4232之間有一個空格。所以當你拆分時,第一個條目是空字符串。您可以檢查第二個條目,但更好的方法是使用string.Trim()之前string.Split()

0

如前所述,其他用戶的問題是空白。一個簡單的解決辦法是添加裝飾()來conversionRate:

rawSplit = GetSplit(conversionRate.Trim()); 

這將允許保持你的代碼的其餘部分完好(即便如此,這將是最好拿出的ToString的不必要的使用())。

1

如已經由裏德·科普塞回答您當前的問題是可以解決

new[] {' '} 

不過,我出這樣

的一些其他方式使用正則表達式

var result = Regex.Match(secondRate, @"\d+(\.\d+)?").Value; 

但是,假設您的輸入字符串類型爲"0.4232 Other Currency Name 0.45",您需要匹配兩個十進制值。在這種情況下,您可以繼續使用Regex.Matches

例如

string secondRate ="0.4232 Other Currency Name 0.45"; 
var result = Regex.Match(secondRate, @"\d+(\.\d+)?").Value; 

      MatchCollection matches = Regex.Matches(secondRate, @"\d+(\.\d+)?"); 
      foreach (Match match in matches) 
      { 
       foreach (Capture capture in match.Captures) 
       { 
        Console.WriteLine("Value={1}", capture.Index, capture.Value); 
       } 
      } 

通過利用將擴展方法

完整代碼

string rawInput = "1 Some Currency Name = 0.4232 Other Currency Name 0.45"; 
      string[] rawSplit = rawInput.Split('='); 
      string firstRate = rawSplit[0].ToString(); 
      string secondRate = rawSplit[1].ToString(); 
      string[] lastSplit = secondRate.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

      decimal num = 0; 
      lastSplit 
       .Where(d => decimal.TryParse(d, out num)) 
       .ToList() 
       .ForEach(i => Console.WriteLine(i)); 

輸出

0.4232 
0.45