Parse过程中的“输入字符串格式不正确”

时间:2014-11-18 23:20:30

标签: c# indexing

我在这个编程领域没有太多经验,而且我遇到了以下错误:

  

输入字符串的格式不正确。

这显示在我的代码的以下行中:

decimal amount = decimal.Parse(entry.Split('$')[0]); 

我不太确定如何解决这个问题,我们将不胜感激。

File.WriteAllText("C:\\Users\\Harry\\Documents\\Streamtip\\tip-top.txt", String.Empty);

Dictionary<string, decimal> names = new Dictionary<string, decimal>();
sR = new StreamReader("C:\\Users\\Harry\\Documents\\Streamtip\\tip-list-recent.txt");
while (!sR.EndOfStream)
{
    string line = sR.ReadLine();
    var entries = line.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

    foreach (var entry in entries)
    {
        decimal amount = decimal.Parse(entry.Split('$')[0]);
        string nameSplit = entry.Split('.', ':')[1].Trim();

        if (names.ContainsKey(nameSplit))
        {
            names[nameSplit] += amount;
            Console.WriteLine("Hoozah!");
        }
        else
        {
            names.Add(nameSplit, amount);
            Console.WriteLine("Failure");
        }
    }

} sR.Close();

EDIT 输入数据

1. Jim: $22.00, 2. Jim: $2100.00, 3. Jim: $6.00, 4. Jim: $32.00, 5. Jim: $2.00,

3 个答案:

答案 0 :(得分:4)

认为您希望entry.Split('$')[1]不是entry.Split('$')[0],因为美元价值是在美元符号之后。

一般情况下,您应该使用decimal.TryParse()来检查输入错误,或者检查来自decimal.Parse()的各种异常:

try
{
    decimal amount = decimal.Parse(entry.Split('$')[1]);
}
catch (FormatException ex)
{
    // handle the error.
}

例如:

       foreach (var entry in entries)
        {
            try
            {
                var tokens = entry.Split('$');
                decimal amount;
                if (tokens.Length > 1)
                    amount = decimal.Parse(tokens[1]);
                else
                    throw new FormatException("invalid entry");

                string nameSplit = entry.Split('.', ':')[1].Trim();

                if (names.ContainsKey(nameSplit))
                {
                    names[nameSplit] += amount;
                    Console.WriteLine("Hoozah!");
                }
                else
                {
                    names.Add(nameSplit, amount);
                    Console.WriteLine("Failure");
                }
            }
            catch (FormatException)
            {
                Console.WriteLine(string.Format("Format exception for entry \"{0}\"", entry));
            }
            catch (Exception ex)
            {
                Console.WriteLine(string.Format("{0} for entry \"{1}\"", ex.GetType().Name, entry));
            }
        }

<强>更新

然后,如果您需要输出每个名字的总金额,您可以在例程结束时执行:

    foreach (var pair in names)
        Console.WriteLine(string.Format("{0}: {1:C2}", pair.Key, pair.Value));

答案 1 :(得分:2)

您假设entry.Split('$')[0]是数字值,而不是。在阅读用户输入时,您应该使用TryParse()代替,以便捕获错误。

编辑:dbc是对的,但你仍然应该这样做,而不是假设你的输入文件是完美的。

decimal amount = 0;

if (decimal.TryParse(entry.Split('$')[0], out amount))
{
    string nameSplit = entry.Split('.', ':')[1].Trim();

    if (names.ContainsKey(nameSplit))
    {
        names[nameSplit] += amount;
        Console.WriteLine("Hoozah!");
    }
    else
    {
        names.Add(nameSplit, amount);
        Console.WriteLine("Failure");
    }
}
else
{
    // the input file has an invalid line, do something about it
}

答案 2 :(得分:2)

decimal.Parse有一个接受NumberStyle的重载,您可以选择Currency。这样可以避免使用split并从$拆分字符串。

decimal amount = decimal.Parse(entry, NumberStyles.Currency);