String.Split()返回空值

时间:2012-08-29 19:57:28

标签: c# string split

我只需要读取完整字符串的特定部分。该字符串将采用以下形式:

“1 Some Currency Name = 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();
}

欢迎任何想法或建议,我们将不胜感激!

5 个答案:

答案 0 :(得分:12)

问题是,当您将原始字符串拆分为'='时,您会在结果的开头获得一个额外空格的结果,基本上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();

答案 1 :(得分:1)

您目前的问题可以通过Reed Copsey已经解答过来解决。

new[] {' '}

但是,我正在展示其他一些方法

使用正则表达式

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

但是假设您的输入字符串是"0.4232 Other Currency Name 0.45"类型,您需要匹配两个小数值。在这种情况下,您可以继续Regex.Matches

e.g。

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);
               }
           }

使用Where扩展方法

完整代码

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

答案 2 :(得分:0)

以下将返回字符串“0.4232其他货币名称”

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

之前有一个空格,所以在以下时再次拆分:

return inputString.Split();

数组中的0位是该空格,您要么想要位置1,要么在最终分割之前进行修剪。

答案 3 :(得分:0)

字符串的第二部分是= 0.4232,在=和0.4232之间有一个空格。所以当你拆分时,第一个条目是空字符串。您可以检查第二个条目,但在使用string.Trim()

之前更好的方法是string.Split()

答案 4 :(得分:0)

如前所述,其他用户的问题是空白区域。一个简单的解决方案是将trim()添加到conversionRate:

rawSplit = GetSplit(conversionRate.Trim());

这样可以保持代码的其余部分不变(即便如此,最好不要使用ToString())。