String.Split() 返回空值

3

我需要仅读取完整字符串中特定部分的内容。字符串的格式如下:

"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.4232...,这意味着当按空格分割时第一个条目为空。 - pstrjds
2
出于好奇,为什么您要在已经是字符串的值上调用 ToString() 方法呢? - Jon Skeet
5个回答

14
问题在于,当您在 '=' 处拆分原始字符串时,得到的结果开头会有一个额外的空格,基本上 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

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

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

使用 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

0
以下代码会返回字符串 "0.4232 其他货币名称"。
string conversionRate = rawSplit[1].ToString();

这里有一个空格,所以在此处再次分割:

return inputString.Split();

数组中的第0个位置是空格,你要么想要第1个位置,要么在最后拆分之前进行修剪。

0

正如其他用户之前所述,问题在于空格。一个简单的解决方案是在 conversionRate 中添加 trim():

rawSplit = GetSplit(conversionRate.Trim());

这将允许保持您的其余代码完整(即使如此,最好去掉不必要的ToString()使用)。


0
字符串的第二部分是= 0.4232,等号和0.4232之间有一个空格。因此,在拆分时,第一个条目为空字符串。您可以检查第二个条目,但更好的方法是在使用string.Split()之前进行string.Trim()处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接