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

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

4

5 回答 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();
于 2012-08-29T19:59:08.577 回答
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
于 2012-08-30T11:38:45.510 回答
0

正如其他用户之前所说,问题出在空白处。一种简单的解决方案是将 trim() 添加到 conversionRate:

rawSplit = GetSplit(conversionRate.Trim());

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

于 2012-08-29T20:22:52.720 回答
0

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

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

这前面有一个空格,所以当再次拆分时:

return inputString.Split();

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

于 2012-08-29T20:02:01.357 回答
0

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

于 2012-08-29T20:02:46.357 回答