“输入字符串格式不正确”在解析过程中

本文关键字:过程中 不正确 输入 字符串 格式 | 更新日期: 2023-09-27 18:30:49

我在编程领域没有太多经验,我陷入了以下错误:

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

这出现在我的代码的以下行中:

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

编辑输入的数据

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

“输入字符串格式不正确”在解析过程中

认为您希望不要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));

你假设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
}

decimal.Parse有一个接受NumberStyle的重载,你可以选择Currency。这避免了必须使用 split 并将字符串与$ 分开。

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